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);
        }
Beispiel #5
0
 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);
			}

		}