-
Notifications
You must be signed in to change notification settings - Fork 204
/
Copy pathDoodleDraw.cs
126 lines (109 loc) · 2.52 KB
/
DoodleDraw.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.Graphics;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
namespace SampleBrowser
{
public class DoodleDraw : View
{
private Paint mPaint;
public DoodleDraw(Context context) :
base(context)
{
mPath = new Path();
mBitmapPaint = new Paint(PaintFlags.Dither);
}
public int width;
public int height;
private Bitmap mBitmap;
internal Canvas mCanvas;
internal Path mPath;
private Paint mBitmapPaint;
protected override void OnSizeChanged(int w, int h, int oldw, int oldh)
{
base.OnSizeChanged(w, h, oldw, oldh);
mBitmap = Bitmap.CreateBitmap(w, h, Bitmap.Config.Argb8888);
mCanvas = new Canvas(mBitmap);
}
internal Color drawColor = Color.Green; internal int strokeWidth = 12; internal Paint.Style style = Paint.Style.Stroke;
protected override void OnDraw(Canvas canvas)
{
base.OnDraw(canvas);
mPaint = new Paint();
mPaint.AntiAlias = true;
mPaint.Dither = true;
mPaint.Color = drawColor;
mPaint.SetStyle(style);
mPaint.StrokeJoin = Paint.Join.Round;
mPaint.StrokeCap = Paint.Cap.Round;
mPaint.StrokeWidth = strokeWidth;
if (!isPaintTapped)
{
canvas.DrawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.DrawPath(mPath, mPaint);
}
else
{
canvas.DrawColor(drawColor);
}
}
private float mX, mY;
private static float TOUCH_TOLERANCE = 4;
internal bool isPaintTapped = false;
private void touch_start(float x, float y)
{
mPath.Reset();
mPath.MoveTo(x, y);
mX = x;
mY = y;
}
private void touch_move(float x, float y)
{
float dx = Math.Abs(x - mX);
float dy = Math.Abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE)
{
mPath.QuadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
mX = x;
mY = y;
}
}
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 override bool OnTouchEvent(MotionEvent e)
{
float x = e.GetX();
float y = e.GetY();
switch (e.ActionMasked)
{
case MotionEventActions.Down:
touch_start(x, y);
Invalidate();
break;
case MotionEventActions.Move:
touch_move(x, y);
Invalidate();
break;
case MotionEventActions.Up:
touch_up();
Invalidate();
break;
}
return true;
}
}
}