protected override void Draw(Canvas canvas, Rect bounds) { int saveCount = canvas.Save(); RectF arcBounds = mCurrentBounds; arcBounds.Set(bounds); //draw bottle mPaint.SetStyle(Paint.Style.Stroke); mPaint.Color = new Color(mBottleColor); canvas.DrawPath(CreateBottlePath(mBottleBounds), mPaint); //draw water mPaint.SetStyle(Paint.Style.FillAndStroke); mPaint.Color = new Color(mWaterColor); canvas.DrawPath(CreateWaterPath(mWaterBounds, mProgress), mPaint); //draw water drop mPaint.SetStyle(Paint.Style.Fill); mPaint.Color = new Color(mWaterColor); foreach (WaterDropHolder waterDropHolder in mWaterDropHolders) { if (waterDropHolder.mNeedDraw) { canvas.DrawCircle(waterDropHolder.mInitX, waterDropHolder.mCurrentY, waterDropHolder.mRadius, mPaint); } } //draw loading text mPaint.Color = new Color(mBottleColor); canvas.DrawText(LOADING_TEXT, mBottleBounds.CenterX() - mLoadingBounds.Width() / 2.0f, mBottleBounds.Bottom + mBottleBounds.Height() * 0.2f, mPaint); canvas.RestoreToCount(saveCount); }
protected override void Draw(Canvas canvas, Rect bounds) { int SaveCount = canvas.Save(); RectF arcBounds = mCurrentBounds; arcBounds.Set(bounds); mPaint.Color = new Color(mBottomColor); canvas.DrawPath(mCurrentBottomWaitPath, mPaint); mPaint.Color = new Color(mMiddleColor); canvas.DrawPath(mCurrentMiddleWaitPath, mPaint); mPaint.Color = new Color(mTopColor); canvas.DrawPath(mCurrentTopWaitPath, mPaint); canvas.RestoreToCount(SaveCount); }
protected override void Draw(Canvas canvas, Rect bounds) { int saveCount = canvas.Save(); RectF arcBounds = mTempBounds; arcBounds.Set(bounds); mPaint.Alpha = MAX_ALPHA; mPaint.SetStyle(Paint.Style.Stroke); mPaint.Color = new Color(mCurrentColor); if (mSunCoordinateY < mInitSun_MoonCoordinateY) { canvas.DrawCircle(arcBounds.CenterX(), mSunCoordinateY, mSun_MoonRadius, mPaint); } if (mMoonCoordinateY < mInitSun_MoonCoordinateY) { int moonSaveCount = canvas.Save(); canvas.Rotate(mMoonRotation, arcBounds.CenterX(), mMoonCoordinateY); canvas.DrawPath(CreateMoonPath(arcBounds.CenterX(), mMoonCoordinateY), mPaint); canvas.RestoreToCount(moonSaveCount); } for (int i = 0; i < mSunRayCount; i++) { int sunRaySaveCount = canvas.Save(); //rotate 45 degrees can change the direction of 0 degrees to 1:30 clock //-mSunRayRotation means reverse rotation canvas.Rotate(45 - mSunRayRotation + (mIsExpandSunRay ? i : MAX_SUN_RAY_COUNT - i) * DEGREE_360 / MAX_SUN_RAY_COUNT, arcBounds.CenterX(), mSunCoordinateY); canvas.DrawLine(arcBounds.CenterX(), mSunRayStartCoordinateY, arcBounds.CenterX(), mSunRayEndCoordinateY, mPaint); canvas.RestoreToCount(sunRaySaveCount); } if (mShowStar) { if (mStarHolders.Count == 0) { InitStarHolders(arcBounds); } for (int i = 0; i < mStarHolders.Count; i++) { mPaint.SetStyle(Paint.Style.Fill); mPaint.Alpha = mStarHolders[i].mAlpha; canvas.DrawCircle(mStarHolders[i].mCurrentPoint.X, mStarHolders[i].mCurrentPoint.Y, mStarRadius, mPaint); } } canvas.RestoreToCount(saveCount); }
protected override void Draw(Canvas canvas, Rect bounds) { int saveCount = canvas.Save(); RectF arcBounds = mTempBounds; arcBounds.Set(bounds); mPaint.Color = new Color(mColor); //calculate fish clip bounds //clip the width of the fish need to increase mPathDottedLineSize * 1.2f RectF fishRectF = new RectF(mFishHeadPos[0] - mFishWidth / 2.0f - mPathDottedLineSize * 1.2f, mFishHeadPos[1] - mFishHeight / 2.0f, mFishHeadPos[0] + mFishWidth / 2.0f + mPathDottedLineSize * 1.2f, mFishHeadPos[1] + mFishHeight / 2.0f); Matrix matrix = new Matrix(); matrix.PostRotate(mFishRotateDegrees, fishRectF.CenterX(), fishRectF.CenterY()); matrix.MapRect(fishRectF); //draw river int riverSaveCount = canvas.Save(); mPaint.SetStyle(Paint.Style.Stroke); canvas.ClipRect(fishRectF, Region.Op.Difference); canvas.DrawPath(CreateRiverPath(arcBounds), mPaint); canvas.RestoreToCount(riverSaveCount); //draw fish int fishSaveCount = canvas.Save(); mPaint.SetStyle(Paint.Style.Fill); canvas.Rotate(mFishRotateDegrees, mFishHeadPos[0], mFishHeadPos[1]); canvas.ClipPath(CreateFishEyePath(mFishHeadPos[0], mFishHeadPos[1] - mFishHeight * 0.06f), Region.Op.Difference); canvas.DrawPath(CreateFishPath(mFishHeadPos[0], mFishHeadPos[1]), mPaint); canvas.RestoreToCount(fishSaveCount); canvas.RestoreToCount(saveCount); }
public void FillPolygon(Brush brush, Point[] points) { APaint.Color = brush.Color.AColor(); APaint.Flags = (Android.Graphics.PaintFlags) 0; APaint.Flags = Flags; APaint.SetStyle(Android.Graphics.Paint.Style.Fill); APaint.StrokeWidth = LineWidth; var p = new Android.Graphics.Path(); p.MoveTo(points[0].X, points[0].Y); foreach (var pt in points) { p.LineTo(pt.X, pt.Y); } ACanvas.DrawPath(p, APaint); p.Dispose(); }
public override Carto.Graphics.Bitmap OnDrawPopup(PopupDrawInfo popupDrawInfo) { PopupStyle style = popupDrawInfo.Popup.Style; // Calculate scaled dimensions float DPToPX = popupDrawInfo.DPToPX; float PXTODP = 1 / DPToPX; if (style.ScaleWithDPI) { DPToPX = 1; } else { PXTODP = 1; } float screenWidth = popupDrawInfo.ScreenBounds.GetWidth() * PXTODP; float screenHeight = popupDrawInfo.ScreenBounds.GetHeight() * PXTODP; // Update sizes based on scale (uses extension method, cf. Shared/Extensions int fontSize = FontSize.Update(DPToPX); int triangleWidth = TriangleSize.Update(DPToPX); int triangleHeight = TriangleSize.Update(DPToPX); int strokeWidth = StrokeWidth.Update(DPToPX); int screenPadding = ScreenPadding.Update(DPToPX); // Set font var font = Android.Graphics.Typeface.Create("HelveticaNeue-Light", Android.Graphics.TypefaceStyle.Normal); // Calculate the maximum popup size, adjust with dpi int maxPopupWidth = (int)(Math.Min(screenWidth, screenHeight)); float halfStrokeWidth = strokeWidth * 0.5f; int maxTextWidth = maxPopupWidth - (2 * screenPadding + strokeWidth); // Measure text TextPaint textPaint = new TextPaint { Color = TextColor, TextSize = fontSize }; textPaint.SetTypeface(font); var textLayout = new StaticLayout(text, textPaint, maxTextWidth, Layout.Alignment.AlignNormal, 1, 0, false); int textX = (int)Math.Min(textPaint.MeasureText(text), textLayout.Width); int textY = textLayout.Height; int popupWidth = textX + (2 * PopupPadding + strokeWidth + triangleWidth); int popupHeight = textY + (2 * PopupPadding + strokeWidth); var bitmap = Android.Graphics.Bitmap.CreateBitmap(popupWidth, popupHeight, Android.Graphics.Bitmap.Config.Argb8888); var canvas = new Android.Graphics.Canvas(bitmap); var trianglePath = new Android.Graphics.Path(); trianglePath.MoveTo(triangleWidth, 0); trianglePath.LineTo(halfStrokeWidth, triangleHeight * 0.5f); trianglePath.LineTo(triangleWidth, triangleHeight); trianglePath.Close(); int triangleOffsetX = 0; int triangleOffsetY = (popupHeight - triangleHeight) / 2; // Create paint object var paint = new Android.Graphics.Paint(); paint.AntiAlias = true; paint.SetStyle(Android.Graphics.Paint.Style.Stroke); paint.StrokeWidth = strokeWidth; paint.Color = StrokeColor; // Stroke background var background = new Android.Graphics.RectF(); background.Left = triangleWidth; background.Top = halfStrokeWidth; background.Right = popupWidth - strokeWidth; background.Bottom = popupHeight - strokeWidth; canvas.DrawRect(background, paint); // Stroke triangle canvas.Save(); canvas.Translate(triangleOffsetX, triangleOffsetY); canvas.DrawPath(trianglePath, paint); canvas.Restore(); // Fill background paint.SetStyle(Android.Graphics.Paint.Style.Fill); paint.Color = BackgroundColor; canvas.DrawRect(background, paint); // Fill triangle canvas.Save(); canvas.Translate(triangleOffsetX, triangleOffsetY); canvas.DrawPath(trianglePath, paint); canvas.Restore(); if (textLayout != null) { // Draw text canvas.Save(); canvas.Translate(halfStrokeWidth + triangleWidth + PopupPadding, halfStrokeWidth + PopupPadding); textLayout.Draw(canvas); canvas.Restore(); } return(BitmapUtils.CreateBitmapFromAndroidBitmap(bitmap)); }
public override Carto.Graphics.Bitmap OnDrawPopup(PopupDrawInfo popupDrawInfo) { PopupStyle style = popupDrawInfo.Popup.Style; // Calculate scaled dimensions float DPToPX = popupDrawInfo.DPToPX; float PXTODP = 1 / DPToPX; if (style.ScaleWithDPI) { DPToPX = 1; } else { PXTODP = 1; } float screenWidth = popupDrawInfo.ScreenBounds.GetWidth() * PXTODP; float screenHeight = popupDrawInfo.ScreenBounds.GetHeight() * PXTODP; // Update sizes based on scale (uses extension method, cf. Shared/Extensions int fontSize = FontSize.Update(DPToPX); int triangleWidth = TriangleSize.Update(DPToPX); int triangleHeight = TriangleSize.Update(DPToPX); int strokeWidth = StrokeWidth.Update(DPToPX); int screenPadding = ScreenPadding.Update(DPToPX); // Set font var font = Android.Graphics.Typeface.Create("HelveticaNeue-Light", Android.Graphics.TypefaceStyle.Normal); // Calculate the maximum popup size, adjust with dpi int maxPopupWidth = (int)(Math.Min(screenWidth, screenHeight)); float halfStrokeWidth = strokeWidth * 0.5f; int maxTextWidth = maxPopupWidth - (2 * screenPadding + strokeWidth); // Measure text TextPaint textPaint = new TextPaint { Color = TextColor, TextSize = fontSize }; textPaint.SetTypeface(font); var textLayout = new StaticLayout(text, textPaint, maxTextWidth, Layout.Alignment.AlignNormal, 1, 0, false); int textX = (int)Math.Min(textPaint.MeasureText(text), textLayout.Width); int textY = textLayout.Height; int popupWidth = textX + (2 * PopupPadding + strokeWidth + triangleWidth); int popupHeight = textY + (2 * PopupPadding + strokeWidth); var bitmap = Android.Graphics.Bitmap.CreateBitmap(popupWidth, popupHeight, Android.Graphics.Bitmap.Config.Argb8888); var canvas = new Android.Graphics.Canvas(bitmap); var trianglePath = new Android.Graphics.Path(); trianglePath.MoveTo(triangleWidth, 0); trianglePath.LineTo(halfStrokeWidth, triangleHeight * 0.5f); trianglePath.LineTo(triangleWidth, triangleHeight); trianglePath.Close(); int triangleOffsetX = 0; int triangleOffsetY = (popupHeight - triangleHeight) / 2; // Create paint object var paint = new Android.Graphics.Paint(); paint.AntiAlias = true; paint.SetStyle(Android.Graphics.Paint.Style.Stroke); paint.StrokeWidth = strokeWidth; paint.Color = StrokeColor; // Stroke background var background = new Android.Graphics.RectF(); background.Left = triangleWidth; background.Top = halfStrokeWidth; background.Right = popupWidth - strokeWidth; background.Bottom = popupHeight - strokeWidth; canvas.DrawRect(background, paint); // Stroke triangle canvas.Save(); canvas.Translate(triangleOffsetX, triangleOffsetY); canvas.DrawPath(trianglePath, paint); canvas.Restore(); // Fill background paint.SetStyle(Android.Graphics.Paint.Style.Fill); paint.Color = BackgroundColor; canvas.DrawRect(background, paint); // Fill triangle canvas.Save(); canvas.Translate(triangleOffsetX, triangleOffsetY); canvas.DrawPath(trianglePath, paint); canvas.Restore(); if (textLayout != null) { // Draw text canvas.Save(); canvas.Translate(halfStrokeWidth + triangleWidth + PopupPadding, halfStrokeWidth + PopupPadding); textLayout.Draw(canvas); canvas.Restore(); } return BitmapUtils.CreateBitmapFromAndroidBitmap(bitmap); }
protected override void Draw(Canvas canvas, Rect bounds) { int saveCount = canvas.Save(); RectF arcBounds = mTempBounds; arcBounds.Set(bounds); arcBounds.Inset(mStrokeXInset, mStrokeYInset); mCurrentProgressBounds.Set(arcBounds.Left, arcBounds.Bottom - 2 * mCenterRadius, arcBounds.Right, arcBounds.Bottom); //Draw loading Drawable mLoadingDrawable.SetBounds((int)arcBounds.CenterX() - mLoadingDrawable.IntrinsicWidth / 2, 0, (int)arcBounds.CenterX() + mLoadingDrawable.IntrinsicWidth / 2, mLoadingDrawable.IntrinsicHeight); mLoadingDrawable.Draw(canvas); //Draw progress background float progressInset = mCenterRadius - mProgressCenterRadius; RectF progressRect = new RectF(mCurrentProgressBounds); //sub DEFAULT_STROKE_INTERVAL, otherwise will have a interval between progress background and progress outline progressRect.Inset(progressInset - DEFAULT_STROKE_INTERVAL, progressInset - DEFAULT_STROKE_INTERVAL); mPaint.Color = new Color(mProgressBgColor); mPaint.SetStyle(Paint.Style.Fill); canvas.DrawRoundRect(progressRect, mProgressCenterRadius, mProgressCenterRadius, mPaint); //Draw progress mPaint.Color = new Color(mProgressColor); mPaint.SetStyle(Paint.Style.Fill); canvas.DrawPath(CreateProgressPath(mProgress, mProgressCenterRadius, progressRect), mPaint); //Draw leaves for (int i = 0; i < mLeafHolders.Count; i++) { int leafSaveCount = canvas.Save(); LeafHolder leafHolder = mLeafHolders[i]; Rect leafBounds = leafHolder.mLeafRect; canvas.Rotate(leafHolder.mLeafRotation, leafBounds.CenterX(), leafBounds.CenterY()); mLeafDrawable.Bounds = leafBounds; mLeafDrawable.Draw(canvas); canvas.RestoreToCount(leafSaveCount); } //Draw progress background outline, //after Drawing the leaves and then Draw the outline of the progress background can //prevent the leaves from flying to the outside RectF progressOutlineRect = new RectF(mCurrentProgressBounds); float progressOutlineStrokeInset = (mCenterRadius - mProgressCenterRadius) / 2.0f; progressOutlineRect.Inset(progressOutlineStrokeInset, progressOutlineStrokeInset); mPaint.SetStyle(Paint.Style.Stroke); mPaint.Color = new Color(mProgressBgColor); mPaint.StrokeWidth = mCenterRadius - mProgressCenterRadius; canvas.DrawRoundRect(progressOutlineRect, mCenterRadius, mCenterRadius, mPaint); //Draw electric fan outline float electricFanCenterX = arcBounds.Right - mCenterRadius; float electricFanCenterY = arcBounds.Bottom - mCenterRadius; mPaint.Color = new Color(mElectricFanOutlineColor); mPaint.SetStyle(Paint.Style.Stroke); mPaint.StrokeWidth = mStrokeWidth; canvas.DrawCircle(arcBounds.Right - mCenterRadius, arcBounds.Bottom - mCenterRadius, mCenterRadius - mStrokeWidth / 2.0f, mPaint); //Draw electric background mPaint.Color = new Color(mElectricFanBgColor); mPaint.SetStyle(Paint.Style.Fill); canvas.DrawCircle(arcBounds.Right - mCenterRadius, arcBounds.Bottom - mCenterRadius, mCenterRadius - mStrokeWidth + DEFAULT_STROKE_INTERVAL, mPaint); //Draw electric fan int rotateSaveCount = canvas.Save(); canvas.Rotate(mRotation, electricFanCenterX, electricFanCenterY); mElectricFanDrawable.SetBounds((int)(electricFanCenterX - mElectricFanDrawable.IntrinsicWidth / 2 * mScale), (int)(electricFanCenterY - mElectricFanDrawable.IntrinsicHeight / 2 * mScale), (int)(electricFanCenterX + mElectricFanDrawable.IntrinsicWidth / 2 * mScale), (int)(electricFanCenterY + mElectricFanDrawable.IntrinsicHeight / 2 * mScale)); mElectricFanDrawable.Draw(canvas); canvas.RestoreToCount(rotateSaveCount); //Draw 100% text if (mScale < 1.0f) { mPaint.TextSize = mTextSize * (1 - mScale); mPaint.Color = new Color(mElectricFanOutlineColor); Rect textRect = new Rect(); mPaint.GetTextBounds(PERCENTAGE_100, 0, PERCENTAGE_100.Length, textRect); canvas.DrawText(PERCENTAGE_100, electricFanCenterX - textRect.Width() / 2.0f, electricFanCenterY + textRect.Height() / 2.0f, mPaint); } canvas.RestoreToCount(saveCount); }