public Stream GetArcPartFromSquareImage(Stream ms, int partNumber, int nbParts) { Stream result = null; using (Bitmap bitmap = BitmapFactory.DecodeStream(ms)) { int diameter = bitmap.Width; // (int)(AvatarSize * GetDensity()); float arcAngle = 360 / nbParts; float arcStart = 90 + (partNumber - 1) * arcAngle; if (nbParts > 2) { arcStart += (180 / nbParts); } float deltaX = (float)(diameter / 2 - ((diameter * Math.Cos(DegreeToRadian(arcStart + arcAngle / 2)) + diameter) / 2)) / 2; float deltaY = (float)(diameter / 2 - ((diameter * Math.Sin(DegreeToRadian(arcStart + arcAngle / 2)) + diameter) / 2)) / 2; float startX = (float)((diameter * Math.Cos(DegreeToRadian(arcStart)) + diameter) / 2); float startY = (float)((diameter * Math.Sin(DegreeToRadian(arcStart)) + diameter) / 2); //float endX = (float)((diameter * Math.Cos(DegreeToRadian(arcStart + arcAngle)) + diameter) / 2); //float endY = (float)((diameter * Math.Sin(DegreeToRadian(arcStart + arcAngle)) + diameter) / 2); using (Bitmap temp = Bitmap.CreateBitmap(diameter, diameter, Bitmap.Config.Argb8888)) { // First we get the bitmap part (we translate using deltaX/Y to have the center of the avatar) using (BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.Clamp, Shader.TileMode.Clamp)) { using (Paint paint = new Paint(PaintFlags.AntiAlias)) { paint.SetShader(shader); using (Android.Graphics.Path path = new Android.Graphics.Path()) { using (Canvas canvas = new Canvas(temp)) { path.MoveTo(diameter / 2 + deltaX, diameter / 2 + deltaY); path.LineTo(startX + deltaX, startY + deltaY); path.AddArc(deltaX, deltaY, diameter + deltaX, diameter + deltaY, arcStart, arcAngle); path.LineTo(diameter / 2 + deltaX, diameter / 2 + deltaY); canvas.DrawPath(path, paint); //canvas.DrawArc(deltaX, deltaY, deltaX + diameter, deltaY + diameter, arcStart, arcAngle, true, paint); } } } } // Now we translate back to have correct layout result = GetTranslated(GetStreamFromBitmap(temp), -deltaX, -deltaY); temp.Recycle(); } bitmap.Recycle(); } return(result); }
public Path BuildPath (float animationProgress, float animationSeek) { Path path = null; if (base.Value.StartAngle <= animationSeek) { path = new Path (); var sweepAngle = CalculateSweepAngle (animationSeek, base.Value); path.AddArc (base.DrawingArea, base.Value.StartAngle, sweepAngle); } return path; }
public Path BuildPath (float animationProgress, float animationSeek) { var startAngle = FitChart.StartAngle; var valueSweepAngle = base.Value.StartAngle + base.Value.SweepAngle; valueSweepAngle -= startAngle; var sweepAngle = valueSweepAngle * animationProgress; var path = new Path (); path.AddArc (base.DrawingArea, startAngle, sweepAngle); return path; }
private Path CreateRightEyeCircle(RectF arcBounds, float offsetY) { Path path = new Path(); //the center of the right eye float rightEyeCenterX = arcBounds.CenterX() + mEyeInterval / 2.0f + mEyeCircleRadius; float rightEyeCenterY = arcBounds.CenterY() + offsetY; //the bounds of left eye RectF leftEyeBounds = new RectF(rightEyeCenterX - mEyeCircleRadius, rightEyeCenterY - mEyeCircleRadius, rightEyeCenterX + mEyeCircleRadius, rightEyeCenterY + mEyeCircleRadius); path.AddArc(leftEyeBounds, 180, -(DEGREE_180 + 15)); //the above radian of of the eye path.QuadTo(leftEyeBounds.Right - mAboveRadianEyeOffsetX, leftEyeBounds.Top + mEyeCircleRadius * 0.2f, leftEyeBounds.Right - mAboveRadianEyeOffsetX / 4.0f, leftEyeBounds.Top - mEyeCircleRadius * 0.15f); return(path); }
public void AddArc(float xCenter, float yCenter, float radius, float startAngle, float endAngle) { path.AddArc(xCenter - radius, yCenter - radius, xCenter + radius, yCenter + radius, MathHelper.ConvertRadToDeg(startAngle), MathHelper.ConvertRadToDeg(endAngle - startAngle)); }
private void RenderValue(Canvas canvas, FitChartValue value) { if (!IsInEditMode) { var animationSeek = CalculateAnimationSeek (); var renderer = RendererFactory.Renderer (AnimationMode, value, drawingArea); var path = renderer.BuildPath (animationProgress, animationSeek); if (path != null) { canvas.DrawPath (path, value.Paint); } } else { var path = new Path (); path.AddArc (drawingArea, StartAngle, DesignModeSweepAngle); canvas.DrawPath (path, valueDesignPaint); } }