public override bool OnTouchEvent(MotionEvent e)
        {
            float currentX = e.GetX();
            float currentY = e.GetY();

            switch (e.Action)
            {
            case MotionEventActions.Down:
                path.MoveTo(currentX, currentY);

                previousX = currentX;
                previouxY = currentY;
                return(true);

            case MotionEventActions.Move:
            case MotionEventActions.Up:
                for (int i = 0; i < e.HistorySize; i++)
                {
                    float historicalX = e.GetHistoricalX(i);
                    float historicalY = e.GetHistoricalY(i);
                    path.LineTo(historicalX, historicalY);
                }
                path.LineTo(currentX, currentY);

                Invalidate();

                previousX = currentX;
                previouxY = currentY;
                return(true);

            default:
                return(false);
            }
        }
 private void touch_up()
 {
     mPath.LineTo(mX, mY);
     // commit the path to our offscreen
     mCanvas.DrawPath(mPath, MPaint);
     // kill this so we don't double draw
     mPath.Reset();
 }
        public void DrawPath(IEnumerable <PathOp> ops, Pen pen = null, Brush brush = null)
        {
            if (pen == null && brush == null)
            {
                return;
            }

            using (var path = new global::Android.Graphics.Path()) {
                var bb = new BoundingBoxBuilder();

                Point?prevPoint = null;

                foreach (var op in ops)
                {
                    var mt = op as MoveTo;
                    if (mt != null)
                    {
                        var p = mt.Point;
                        path.MoveTo((float)p.X, (float)p.Y);
                        bb.Add(p);
                        prevPoint = p;
                        continue;
                    }
                    var lt = op as LineTo;
                    if (lt != null)
                    {
                        var p = lt.Point;
                        path.LineTo((float)p.X, (float)p.Y);
                        bb.Add(p);
                        prevPoint = p;
                        continue;
                    }
                    var at = op as ArcTo;
                    if (at != null)
                    {
                        var p = at.Point;

                        if (!prevPoint.HasValue)
                        {
                            throw new NotSupportedException("Cannot begin path with Arc.");
                        }

                        var pp = prevPoint.Value;

                        Point c1, c2;
                        at.GetCircles(pp, out c1, out c2);

                        var circleCenter = at.LargeArc ^ !at.SweepClockwise ? c2 : c1;
                        var rect         = new Rect(circleCenter - at.Radius, at.Radius * 2);

                        var startAngle = Conversions.RadToDeg((float)Math.Atan2(pp.Y - circleCenter.Y, pp.X - circleCenter.X));
                        var endAngle   = Conversions.RadToDeg((float)Math.Atan2(p.Y - circleCenter.Y, p.X - circleCenter.X));

                        var sweepAngle = endAngle - startAngle;

                        if (at.SweepClockwise && sweepAngle < 0)
                        {
                            // If we want to go CW, sweepAngle needs to be positive
                            sweepAngle += 360.0f;
                        }
                        else if (!at.SweepClockwise && sweepAngle > 0)
                        {
                            // If we want to go CCW, sweepAngle needs to be negative
                            sweepAngle -= 360.0f;
                        }

                        path.AddArc(Conversions.GetRectF(rect), startAngle, sweepAngle);

                        bb.Add(p);
                        prevPoint = p;
                        continue;
                    }
                    var ct = op as CurveTo;
                    if (ct != null)
                    {
                        var p  = ct.Point;
                        var c1 = ct.Control1;
                        var c2 = ct.Control2;
                        path.CubicTo((float)c1.X, (float)c1.Y, (float)c2.X, (float)c2.Y, (float)p.X, (float)p.Y);
                        bb.Add(p);
                        bb.Add(c1);
                        bb.Add(c2);
                        prevPoint = p;
                        continue;
                    }
                    var cp = op as ClosePath;
                    if (cp != null)
                    {
                        path.Close();
                        continue;
                    }

                    throw new NotSupportedException("Path Op " + op);
                }

                var frame = bb.BoundingBox;

                if (brush != null)
                {
                    var paint = GetBrushPaint(brush, frame);
                    graphics.DrawPath(path, paint);
                }
                if (pen != null)
                {
                    var paint = GetPenPaint(pen);
                    graphics.DrawPath(path, paint);
                }
            }
        }
        public void DrawPath(IEnumerable<PathOp> ops, Pen pen = null, Brush brush = null)
        {
            if (pen == null && brush == null)
                return;

            using (var path = new global::Android.Graphics.Path ()) {

                var bb = new BoundingBoxBuilder ();

                foreach (var op in ops) {
                    var mt = op as MoveTo;
                    if (mt != null) {
                        var p = mt.Point;
                        path.MoveTo ((float)p.X, (float)p.Y);
                        bb.Add (p);
                        continue;
                    }
                    var lt = op as LineTo;
                    if (lt != null) {
                        var p = lt.Point;
                        path.LineTo ((float)p.X, (float)p.Y);
                        bb.Add (p);
                        continue;
                    }
                    var at = op as ArcTo;
                    if (at != null) {
                        var p = at.Point;
                        path.LineTo ((float)p.X, (float)p.Y);
                        bb.Add (p);
                        continue;
                    }
                    var ct = op as CurveTo;
                    if (ct != null) {
                        var p = ct.Point;
                        var c1 = ct.Control1;
                        var c2 = ct.Control2;
                        path.CubicTo ((float)c1.X, (float)c1.Y, (float)c2.X, (float)c2.Y, (float)p.X, (float)p.Y);
                        bb.Add (p);
                        bb.Add (c1);
                        bb.Add (c2);
                        continue;
                    }
                    var cp = op as ClosePath;
                    if (cp != null) {
                        path.Close ();
                        continue;
                    }

                    throw new NotSupportedException ("Path Op " + op);
                }

                var frame = bb.BoundingBox;

                if (brush != null) {
                    var paint = GetBrushPaint (brush, frame);
                    graphics.DrawPath (path, paint);
                }
                if (pen != null) {
                    var paint = GetPenPaint (pen);
                    graphics.DrawPath (path, paint);
                }
            }
        }
Exemple #5
0
        /// <summary>
        /// Draws a line on the target. The coordinates given are scene coordinates.
        /// </summary>
        /// <param name="x">The x coordinate.</param>
        /// <param name="y">The y coordinate.</param>
        /// <param name="color">Color.</param>
        /// <param name="width">Width.</param>
        /// <param name="casingWidth">Casing width.</param>
        /// <param name="casingColor">Casing color.</param>
        protected override void DrawLine(Target2DWrapper <global::Android.Graphics.Canvas> target, double[] x, double[] y,
                                         int color, double width, LineJoin lineJoine, int[] dashes)
        {
            if (x.Length > 1)
            {
                _paint.AntiAlias = true;
                _paint.SetStyle(global::Android.Graphics.Paint.Style.Stroke);
                if (dashes != null && dashes.Length > 0)
                {                 // set the dashes effect.
                    float[] intervals = new float[dashes.Length];
                    for (int idx = 0; idx < dashes.Length; idx++)
                    {
                        intervals [idx] = dashes [idx];
                    }
                    _paint.SetPathEffect(
                        new global::Android.Graphics.DashPathEffect(
                            intervals, 0));
                }

                float minX = float.MaxValue, maxX = float.MinValue, minY = float.MaxValue, maxY = float.MinValue;
                float xT, yT;

                // convert to the weid android api array!
                _path.Rewind();
                double[] transformed = this.Tranform(x [0], y [0]);
                xT = (float)transformed [0];
                yT = (float)transformed [1];
                _path.MoveTo(xT, yT);
                if (xT < minX)
                {
                    minX = xT;
                }
                if (xT > maxX)
                {
                    maxX = xT;
                }
                if (yT < minY)
                {
                    minY = yT;
                }
                if (yT > maxY)
                {
                    maxY = yT;
                }
                for (int idx = 1; idx < x.Length; idx++)
                {
                    transformed = this.Tranform(x [idx], y [idx]);
                    xT          = (float)transformed[0];
                    yT          = (float)transformed[1];
                    _path.LineTo(xT, yT);
                    if (xT < minX)
                    {
                        minX = xT;
                    }
                    if (xT > maxX)
                    {
                        maxX = xT;
                    }
                    if (yT < minY)
                    {
                        minY = yT;
                    }
                    if (yT > maxY)
                    {
                        maxY = yT;
                    }
                }
                if ((maxX - minX) > 1 || (maxY - minY) > 1)
                {
//					if (casingWidth > 0) {
//						float casingWidthInPixels = this.ToPixels (casingWidth + width);
//						_paint.Color = new global::Android.Graphics.Color (casingColor);
//						_paint.StrokeWidth = casingWidthInPixels;
//						target.Target.DrawPath (_path, _paint);
//					}
                    float widthInPixels = this.ToPixels(width);
                    _paint.Color       = new global::Android.Graphics.Color(color);
                    _paint.StrokeWidth = widthInPixels;
                    target.Target.DrawPath(_path, _paint);
                }
                _paint.Reset();
            }
        }
        public void DrawPath(IEnumerable <PathOp> ops, Pen pen = null, Brush brush = null)
        {
            if (pen == null && brush == null)
            {
                return;
            }

            using (var path = new global::Android.Graphics.Path()) {
                var bb = new BoundingBoxBuilder();

                foreach (var op in ops)
                {
                    var mt = op as MoveTo;
                    if (mt != null)
                    {
                        var p = mt.Point;
                        path.MoveTo((float)p.X, (float)p.Y);
                        bb.Add(p);
                        continue;
                    }
                    var lt = op as LineTo;
                    if (lt != null)
                    {
                        var p = lt.Point;
                        path.LineTo((float)p.X, (float)p.Y);
                        bb.Add(p);
                        continue;
                    }
                    var at = op as ArcTo;
                    if (at != null)
                    {
                        var p = at.Point;
                        path.LineTo((float)p.X, (float)p.Y);
                        bb.Add(p);
                        continue;
                    }
                    var ct = op as CurveTo;
                    if (ct != null)
                    {
                        var p  = ct.Point;
                        var c1 = ct.Control1;
                        var c2 = ct.Control2;
                        path.CubicTo((float)c1.X, (float)c1.Y, (float)c2.X, (float)c2.Y, (float)p.X, (float)p.Y);
                        bb.Add(p);
                        bb.Add(c1);
                        bb.Add(c2);
                        continue;
                    }
                    var cp = op as ClosePath;
                    if (cp != null)
                    {
                        path.Close();
                        continue;
                    }

                    throw new NotSupportedException("Path Op " + op);
                }

                var frame = bb.BoundingBox;

                if (brush != null)
                {
                    var paint = GetBrushPaint(brush, frame);
                    graphics.DrawPath(path, paint);
                }
                if (pen != null)
                {
                    var paint = GetPenPaint(pen);
                    graphics.DrawPath(path, paint);
                }
            }
        }
		public static Bitmap Draw(int width, int height, double direction)
		{
			if(width == 0 || height == 0)
					return null;

			int w2 = width / 2;
			int h2 = height / 2;

			Paint light = new Paint(PaintFlags.AntiAlias);
			Paint dark = new Paint(PaintFlags.AntiAlias);
			Paint black = new Paint(PaintFlags.AntiAlias);

			light.Color = new Color(128, 0, 0, 255);
			light.StrokeWidth = 0f;
			light.SetStyle(Paint.Style.FillAndStroke);

			dark.Color = new Color(255, 0, 0, 255);
			dark.StrokeWidth = 0f;
			dark.SetStyle(Paint.Style.FillAndStroke);

			black.Color = new Color(0, 0, 0, 255);
			black.StrokeWidth = 0f;
			black.SetStyle(Paint.Style.Stroke);

			// Values of direction are between 0° and 360°, but for drawing we need -180° to +180°
			direction -= 180;

			double rad1 = direction / 180.0 * Math.PI;
			double rad2 = (direction + 180.0 + 30.0) / 180.0 * Math.PI;
			double rad3 = (direction + 180.0 - 30.0) / 180.0 * Math.PI; 
			double rad4 = (direction + 180.0) / 180.0 * Math.PI; 

			PointF p1 = new PointF((float) (w2 + w2 * Math.Sin (rad1)), (float) (h2 + h2 * Math.Cos (rad1)));
			PointF p2 = new PointF((float) (w2 + w2 * Math.Sin (rad2)), (float) (h2 + h2 * Math.Cos (rad2)));
			PointF p3 = new PointF((float) (w2 + w2 * Math.Sin (rad3)), (float) (h2 + h2 * Math.Cos (rad3)));
			PointF p4 = new PointF((float) (w2 + width / 3 * Math.Sin (rad4)), (float) (h2 + height / 3 * Math.Cos (rad4)));

			Bitmap b = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888);

			using(Canvas c = new Canvas(b)) {
				int cx = c.Width / 2 - 1;
				int cy = c.Height / 2 - 1;

				global::Android.Graphics.Path path1 = new global::Android.Graphics.Path ();
				global::Android.Graphics.Path path2 = new global::Android.Graphics.Path ();
				global::Android.Graphics.Path path3 = new global::Android.Graphics.Path ();

				path1.MoveTo (p1.X,p1.Y);
				path1.LineTo (p2.X,p2.Y);
				path1.LineTo (p4.X,p4.Y);
				path1.LineTo (p1.X,p1.Y);

				path2.MoveTo (p1.X,p1.Y);
				path2.LineTo (p3.X,p3.Y);
				path2.LineTo (p4.X,p4.Y);
				path2.LineTo (p1.X,p1.Y);

				path3.MoveTo (p1.X,p1.Y);
				path3.LineTo (p2.X,p2.Y);
				path3.LineTo (p4.X,p4.Y);
				path3.LineTo (p1.X,p1.Y);
				path3.LineTo (p3.X,p3.Y);
				path3.LineTo (p4.X,p4.Y);

				light.Color = new Color (128, 0, 0, 255);
				dark.Color = new Color (255, 0, 0, 255);
				black.Color = new Color (0, 0, 0, 255);

				c.DrawPath (path1, light);
				c.DrawPath (path2, dark);
				c.DrawPath (path3, black);
			}

			return b;
		}
Exemple #8
0
        public void DrawPath(IEnumerable<PathOp> ops, Pen pen = null, Brush brush = null)
        {
            if (pen == null && brush == null)
                return;

            using (var path = new global::Android.Graphics.Path ()) {

                var bb = new BoundingBoxBuilder ();

                Point? prevPoint = null;

                foreach (var op in ops) {
                    var mt = op as MoveTo;
                    if (mt != null) {
                        var p = mt.Point;
                        path.MoveTo ((float)p.X, (float)p.Y);
                        bb.Add (p);
                        prevPoint = p;
                        continue;
                    }
                    var lt = op as LineTo;
                    if (lt != null) {
                        var p = lt.Point;
                        path.LineTo ((float)p.X, (float)p.Y);
                        bb.Add (p);
                        prevPoint = p;
                        continue;
                    }
                    var at = op as ArcTo;
                    if (at != null) {
                        var p = at.Point;

                        if (!prevPoint.HasValue) {
                            throw new NotSupportedException("Cannot begin path with Arc.");
                        }

                        var pp = prevPoint.Value;

                        Point c1, c2;
                        at.GetCircles(pp, out c1, out c2);

                        var circleCenter = at.LargeArc ^ !at.SweepClockwise ? c2 : c1;
                        var rect = new Rect(circleCenter - at.Radius, at.Radius * 2);

                        var startAngle = Conversions.RadToDeg((float)Math.Atan2(pp.Y - circleCenter.Y, pp.X - circleCenter.X));
                        var endAngle = Conversions.RadToDeg((float)Math.Atan2(p.Y - circleCenter.Y, p.X - circleCenter.X));

                        var sweepAngle = endAngle - startAngle;

                        if (at.SweepClockwise && sweepAngle < 0) {
                            // If we want to go CW, sweepAngle needs to be positive
                            sweepAngle += 360.0f;
                        }
                        else if (!at.SweepClockwise && sweepAngle > 0) {
                            // If we want to go CCW, sweepAngle needs to be negative
                            sweepAngle -= 360.0f;
                        }

                        path.AddArc(Conversions.GetRectF(rect), startAngle, sweepAngle);

                        bb.Add (p);
                        prevPoint = p;
                        continue;
                    }
                    var ct = op as CurveTo;
                    if (ct != null) {
                        var p = ct.Point;
                        var c1 = ct.Control1;
                        var c2 = ct.Control2;
                        path.CubicTo ((float)c1.X, (float)c1.Y, (float)c2.X, (float)c2.Y, (float)p.X, (float)p.Y);
                        bb.Add (p);
                        bb.Add (c1);
                        bb.Add (c2);
                        prevPoint = p;
                        continue;
                    }
                    var cp = op as ClosePath;
                    if (cp != null) {
                        path.Close ();
                        continue;
                    }

                    throw new NotSupportedException ("Path Op " + op);
                }

                var frame = bb.BoundingBox;

                if (brush != null) {
                    var paint = GetBrushPaint (brush, frame);
                    graphics.DrawPath (path, paint);
                }
                if (pen != null) {
                    var paint = GetPenPaint (pen);
                    graphics.DrawPath (path, paint);
                }
            }
        }
        public static Bitmap Draw(int width, int height, double direction)
        {
            if (width == 0 || height == 0)
            {
                return(null);
            }

            int w2 = width / 2;
            int h2 = height / 2;

            Paint light = new Paint(PaintFlags.AntiAlias);
            Paint dark  = new Paint(PaintFlags.AntiAlias);
            Paint black = new Paint(PaintFlags.AntiAlias);

            light.Color       = new Color(128, 0, 0, 255);
            light.StrokeWidth = 0f;
            light.SetStyle(Paint.Style.FillAndStroke);

            dark.Color       = new Color(255, 0, 0, 255);
            dark.StrokeWidth = 0f;
            dark.SetStyle(Paint.Style.FillAndStroke);

            black.Color       = new Color(0, 0, 0, 255);
            black.StrokeWidth = 0f;
            black.SetStyle(Paint.Style.Stroke);

            // Values of direction are between 0° and 360°, but for drawing we need -180° to +180°
            direction -= 180;

            double rad1 = direction / 180.0 * Math.PI;
            double rad2 = (direction + 180.0 + 30.0) / 180.0 * Math.PI;
            double rad3 = (direction + 180.0 - 30.0) / 180.0 * Math.PI;
            double rad4 = (direction + 180.0) / 180.0 * Math.PI;

            PointF p1 = new PointF((float)(w2 + w2 * Math.Sin(rad1)), (float)(h2 + h2 * Math.Cos(rad1)));
            PointF p2 = new PointF((float)(w2 + w2 * Math.Sin(rad2)), (float)(h2 + h2 * Math.Cos(rad2)));
            PointF p3 = new PointF((float)(w2 + w2 * Math.Sin(rad3)), (float)(h2 + h2 * Math.Cos(rad3)));
            PointF p4 = new PointF((float)(w2 + width / 3 * Math.Sin(rad4)), (float)(h2 + height / 3 * Math.Cos(rad4)));

            Bitmap b = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888);

            using (Canvas c = new Canvas(b)) {
                int cx = c.Width / 2 - 1;
                int cy = c.Height / 2 - 1;

                global::Android.Graphics.Path path1 = new global::Android.Graphics.Path();
                global::Android.Graphics.Path path2 = new global::Android.Graphics.Path();
                global::Android.Graphics.Path path3 = new global::Android.Graphics.Path();

                path1.MoveTo(p1.X, p1.Y);
                path1.LineTo(p2.X, p2.Y);
                path1.LineTo(p4.X, p4.Y);
                path1.LineTo(p1.X, p1.Y);

                path2.MoveTo(p1.X, p1.Y);
                path2.LineTo(p3.X, p3.Y);
                path2.LineTo(p4.X, p4.Y);
                path2.LineTo(p1.X, p1.Y);

                path3.MoveTo(p1.X, p1.Y);
                path3.LineTo(p2.X, p2.Y);
                path3.LineTo(p4.X, p4.Y);
                path3.LineTo(p1.X, p1.Y);
                path3.LineTo(p3.X, p3.Y);
                path3.LineTo(p4.X, p4.Y);

                light.Color = new Color(128, 0, 0, 255);
                dark.Color  = new Color(255, 0, 0, 255);
                black.Color = new Color(0, 0, 0, 255);

                c.DrawPath(path1, light);
                c.DrawPath(path2, dark);
                c.DrawPath(path3, black);
            }

            return(b);
        }
Exemple #10
0
        protected override void OnDraw(Canvas canvas)
        {
            var trans = Element.RenderTransform ?? new IdentityTransform();

            var path = new global::Android.Graphics.Path();

            foreach (var command in PathDataParser.ToAbsolute(PathDataParser.Parse(Element.Data)))
            {
                switch (command.Type)
                {
                case PathDataParser.CommandType.MoveTo:
                {
                    var pt = trans.TransformPoint(
                        new System.Drawing.PointF(command.Arguments[0], command.Arguments[1]));
                    path.MoveTo(pt.X, pt.Y);
                }
                break;

                case PathDataParser.CommandType.LineTo:
                {
                    var pt = trans.TransformPoint(
                        new System.Drawing.PointF(command.Arguments[0], command.Arguments[1]));
                    path.LineTo(pt.X, pt.Y);
                }
                break;

                case PathDataParser.CommandType.QBezier:
                {
                    var pt = trans.TransformPoint(
                        new System.Drawing.PointF(command.Arguments[0], command.Arguments[1]));
                    var pt2 = trans.TransformPoint(
                        new System.Drawing.PointF(command.Arguments[2], command.Arguments[3]));

                    path.QuadTo(pt.X, pt.Y, pt2.X, pt2.Y);
                }

                break;

                case PathDataParser.CommandType.Bezier:
                {
                    var pt = trans.TransformPoint(
                        new System.Drawing.PointF(command.Arguments[0], command.Arguments[1]));
                    var pt2 = trans.TransformPoint(
                        new System.Drawing.PointF(command.Arguments[2], command.Arguments[3]));
                    var pt3 = trans.TransformPoint(
                        new System.Drawing.PointF(command.Arguments[4], command.Arguments[5]));

                    path.CubicTo(pt.X, pt.Y, pt2.X, pt2.Y, pt3.X, pt3.Y);
                }
                break;

                case PathDataParser.CommandType.Close:
                    path.Close();
                    DrawPath(canvas, path);
                    path = new global::Android.Graphics.Path();
                    break;
                }
            }

            if (!path.IsEmpty)
            {
                DrawPath(canvas, path);
            }
        }
		public Bitmap DrawArrow (double direction)
		{
			int w = 48;
			int h = 48;
			int w2 = w / 2;
			int h2 = w / 2;

			double rad1 = direction / 180.0 * Math.PI;
			double rad2 = (direction + 180.0 + 30.0) / 180.0 * Math.PI;
			double rad3 = (direction + 180.0 - 30.0) / 180.0 * Math.PI; 
			double rad4 = (direction + 180.0) / 180.0 * Math.PI; 

			PointF p1 = new PointF((float) (w2 + w2 * Math.Sin (rad1)), (float) (h2 + h2 * Math.Cos (rad1)));
			PointF p2 = new PointF((float) (w2 + w2 * Math.Sin (rad2)), (float) (h2 + h2 * Math.Cos (rad2)));
			PointF p3 = new PointF((float) (w2 + w2 * Math.Sin (rad3)), (float) (h2 + h2 * Math.Cos (rad3)));
			PointF p4 = new PointF((float) (w2 + w / 3 * Math.Sin (rad4)), (float) (h2 + h / 3 * Math.Cos (rad4)));

			Bitmap b = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888);
			Canvas c = new Canvas(b);
			Paint light = new Paint (PaintFlags.AntiAlias);
			Paint dark = new Paint (PaintFlags.AntiAlias);
			Paint black = new Paint (PaintFlags.AntiAlias);

			light.Color = new Color (128, 0, 0, 255);
			light.StrokeWidth = 0f;
			light.SetStyle (Paint.Style.FillAndStroke);

			dark.Color = new Color (255, 0, 0, 255);
			dark.StrokeWidth = 0f;
			dark.SetStyle (Paint.Style.FillAndStroke);

			black.Color = new Color (0, 0, 0, 255);
			black.StrokeWidth = 0f;
			black.SetStyle (Paint.Style.Stroke);

			int cx = c.Width / 2 - 1;
			int cy = c.Height / 2 - 1;

			global::Android.Graphics.Path path1 = new global::Android.Graphics.Path ();
			global::Android.Graphics.Path path2 = new global::Android.Graphics.Path ();
			global::Android.Graphics.Path path3 = new global::Android.Graphics.Path ();

			path1.MoveTo (p1.X,p1.Y);
			path1.LineTo (p2.X,p2.Y);
			path1.LineTo (p4.X,p4.Y);
			path1.LineTo (p1.X,p1.Y);

			path2.MoveTo (p1.X,p1.Y);
			path2.LineTo (p3.X,p3.Y);
			path2.LineTo (p4.X,p4.Y);
			path2.LineTo (p1.X,p1.Y);

			path3.MoveTo (p1.X,p1.Y);
			path3.LineTo (p2.X,p2.Y);
			path3.LineTo (p4.X,p4.Y);
			path3.LineTo (p1.X,p1.Y);
			path3.LineTo (p3.X,p3.Y);
			path3.LineTo (p4.X,p4.Y);

			c.DrawPath (path1, light);
			c.DrawPath (path2, dark);
			c.DrawPath (path3, black);

//			UIGraphics.BeginImageContext (new SizeF(64, 64));
//
//			using (CGContext cont = UIGraphics.GetCurrentContext()) {
//
//				using (CGPath path = new CGPath()) {
//
//					cont.SetLineWidth (1f);
//					cont.SetRGBStrokeColor (0f, 0, 0, 1);
//					cont.SetRGBFillColor (1f, 0, 0, 1);
//					path.AddLines (new PointF[] { p1, p2, p4 });
//					path.CloseSubpath ();
//
//					cont.AddPath (path);
//					cont.DrawPath (CGPathDrawingMode.FillStroke);
//
//				}
//
//				using (CGPath path = new CGPath()) {
//
//					cont.SetRGBStrokeColor (0f, 0, 0, 1);
//					cont.SetRGBFillColor (.5f, 0, 0, 1);
//					path.AddLines (new PointF[] { p1, p3, p4 });
//					path.CloseSubpath ();
//
//					cont.AddPath (path);
//					cont.DrawPath (CGPathDrawingMode.FillStroke);
//
//				}
//
//				return UIGraphics.GetImageFromCurrentImageContext ();
//
//			}
//
//			UIGraphics.EndImageContext ();
			return b;
		}
		/// <summary>
		/// Draws image of arrow with given direction.
		/// </summary>
		/// <returns>Bitmap of arrow.</returns>
		/// <param name="direction">Direction of the arrow.</param>
		internal Bitmap DrawArrow (double direction)
		{
			int w = 48;
			int h = 48;
			int w2 = w / 2;
			int h2 = w / 2;

			double rad1 = direction / 180.0 * Math.PI;
			double rad2 = (direction + 180.0 + 30.0) / 180.0 * Math.PI;
			double rad3 = (direction + 180.0 - 30.0) / 180.0 * Math.PI; 
			double rad4 = (direction + 180.0) / 180.0 * Math.PI; 

			PointF p1 = new PointF((float) (w2 + w2 * Math.Sin (rad1)), (float) (h2 + h2 * Math.Cos (rad1)));
			PointF p2 = new PointF((float) (w2 + w2 * Math.Sin (rad2)), (float) (h2 + h2 * Math.Cos (rad2)));
			PointF p3 = new PointF((float) (w2 + w2 * Math.Sin (rad3)), (float) (h2 + h2 * Math.Cos (rad3)));
			PointF p4 = new PointF((float) (w2 + w / 3 * Math.Sin (rad4)), (float) (h2 + h / 3 * Math.Cos (rad4)));

			Bitmap b = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888);
			using(Canvas c = new Canvas(b)) {
				int cx = c.Width / 2 - 1;
				int cy = c.Height / 2 - 1;

				global::Android.Graphics.Path path1 = new global::Android.Graphics.Path ();
				global::Android.Graphics.Path path2 = new global::Android.Graphics.Path ();
				global::Android.Graphics.Path path3 = new global::Android.Graphics.Path ();

				path1.MoveTo (p1.X,p1.Y);
				path1.LineTo (p2.X,p2.Y);
				path1.LineTo (p4.X,p4.Y);
				path1.LineTo (p1.X,p1.Y);

				path2.MoveTo (p1.X,p1.Y);
				path2.LineTo (p3.X,p3.Y);
				path2.LineTo (p4.X,p4.Y);
				path2.LineTo (p1.X,p1.Y);

				path3.MoveTo (p1.X,p1.Y);
				path3.LineTo (p2.X,p2.Y);
				path3.LineTo (p4.X,p4.Y);
				path3.LineTo (p1.X,p1.Y);
				path3.LineTo (p3.X,p3.Y);
				path3.LineTo (p4.X,p4.Y);

				c.DrawPath (path1, light);
				c.DrawPath (path2, dark);
				c.DrawPath (path3, black);
			}

			return b;
		}