/////////继承SurfaceView 的类
public class PaintView extends SurfaceView implements Runnable,SurfaceHolder.Callback {
private float mX;
private float mY;
private Paint mPaint = null;
private Path mPath = null;
// 线程结束标志位
boolean mLoop = true;
SurfaceHolder mSurfaceHolder = null;
Canvas mCanvas; public PaintView(Context context, AttributeSet arr) {
super(context , arr); mSurfaceHolder = this.getHolder();//获取holder
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setFormat(PixelFormat.OPAQUE);//不透明
//mSurfaceHolder.setFormat(PixelFormat.RGB_565);
//mSurfaceHolder.setFormat(PixelFormat.RGBA_8888);
this.setFocusable(true);
// setZOrderOnTop(true);//放到最顶层
mPaint = new Paint();
mPath = new Path();
mPaint.setAntiAlias(true);
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(5);
mPaint.setColor(mPaintColor);
mPaint.setStrokeCap(Paint.Cap.ROUND); //圆头
mPaint.setDither(true);//消除拉动,使画面圓滑
mPaint.setStrokeJoin(Paint.Join.ROUND); //结合方式,平滑
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub } @Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
new Thread(this).start();//启动线程
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mLoop = false; //结束线程 } @Override
public void run() {
while (mLoop==true) {
Draw();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} // 画图
private void Draw() {
try{
mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawPath(mPath, mPaint); //// }catch (Exception e){
}finally {
if (mCanvas !=null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
} @Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
touchDown(event);
break;
case MotionEvent.ACTION_MOVE:
touchMove(event);
}
//更新绘制
invalidate();
return true;
} //手指点下屏幕时调用
private void touchDown(MotionEvent event)
{
//隐藏之前的绘制
// mPath.reset(); //
float x = event.getX();
float y = event.getY(); mX = x;
mY = y;
//mPath绘制的绘制起点
mPath.moveTo(x, y);
} //手指在屏幕上滑动时调用
private void touchMove(MotionEvent event)
{
final float x = event.getX();
final float y = event.getY(); final float previousX = mX;
final float previousY = mY; final float dx = Math.abs(x - previousX);
final float dy = Math.abs(y - previousY); //两点之间的距离大于等于3时,生成贝塞尔绘制曲线
if (dx >= 3 || dy >= 3)
{
//设置贝塞尔曲线的操作点为起点和终点的一半
float cX = (x + previousX) / 2;
float cY = (y + previousY) / 2; //二次贝塞尔,实现平滑曲线;previousX, previousY为操作点,cX, cY为终点
mPath.quadTo(previousX, previousY, cX, cY); //第二次运行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值
mX = x;
mY = y;
}
}
////橡皮擦
private void setEraser(){
mPaint = new Paint();
mPath = new Path();
mPaint.setAntiAlias(true);
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(50);
// mPaint.setColor(mPaintColor);
mPaint.setStrokeCap(Paint.Cap.ROUND); //圆头
mPaint.setDither(true);//消除拉动,使画面圓滑
mPaint.setStrokeJoin(Paint.Join.ROUND); //结合方式,平滑
mPaint.setAlpha(0); ////
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
}
////////在Activity中显示以上视图
setContentView(new PaintView(this));