1.先上代码,后解析
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class MyBoard extends View {
private Paint mPaint;
private float currentX;
private float currentY;
private Path mPath;
private static ArrayList<Path> mPaths = new ArrayList<Path>();//保存已绘制的信息,Activity销毁时,其中内容并不会销毁,最好对外提供一个清空mPaths的方法。
public MyBoard(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
}
public MyBoard(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public MyBoard(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mPaint == null) {
mPaint = new Paint();
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(4);
mPaint.setAntiAlias(true);// 去锯齿
}
if (mPaths != null && mPaths.size() > 0) {// 显示已画过的图形
for (int i = 0; i < mPaths.size(); i++) {
canvas.drawPath(mPaths.get(i), mPaint);
}
}
if (mPath != null) {// 显示当前画的路径
canvas.drawPath(mPath, mPaint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.currentX = event.getX();
this.currentY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:// 按下
mPath = new Path();
mPath.moveTo(currentX, currentY);
break;
case MotionEvent.ACTION_UP://松开
mPaths.add(mPath);
mPath = null;//必须添加,用于重绘是判断是否绘制
break;
case MotionEvent.ACTION_MOVE:
this.currentX = event.getX();
this.currentY = event.getY();
mPath.lineTo(currentX, currentY);
break;
}
this.invalidate();
return true;// 表明该事件处理完
}
}
2.自定义View的实现:
- 继承View类,
- 重写onDraw()方法。
- 定义一个画笔Paint();
- 在画布Canvas上绘图。
- 重写View的回调方法,实现更多功能