最近因项目需求,需要有一个控件,可用提供用户手写签名并保持保存为图片。
听上去是一个非常酷炫的功能,然而实现起来其实并不复杂,下面会记录一下这个控件的开发过程。
先看下效果:
首先需要定义一个叫做PaintView的类继承自View,并定义一个Paint用来绘制笔画
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
| * Created by zhangfan on 16-6-17. */ public class MyView extends View { private Paint brush = new Paint(); public MyView(Context context) { super(context); init(); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init(){ brush.setAntiAlias(true); brush.setDither(true); brush.setColor(Color.BLUE); brush.setStyle(Paint.Style.STROKE); brush.setStrokeJoin(Paint.Join.ROUND); brush.setStrokeWidth(10f); } }
|
这时候绘制相关的准备工作都已准备完毕,接下来就是如何绘制用户的笔迹了。
我们重写onTouchEvent来监听用户的触摸操作,定义一个Path变量来记录的用户的触摸轨迹。
并重写onDraw方法来绘制。
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
| private Path path = new Path(); @Override protected void onDraw(Canvas canvas) { canvas.drawPath(path, brush); } public boolean onTouchEvent(MotionEvent event) { float pointX = event.getX(); float pointY = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path.moveTo(pointX, pointY); return true; case MotionEvent.ACTION_MOVE: path.lineTo(pointX, pointY); break; default: return false; } postInvalidate(); return false; }
|
到此为止我们的控件已经可用了,不过我们还需要一个方法来情况画布的内容,如下:
1 2 3 4
| public void reset(){ path.reset(); postInvalidate(); }
|
完工。