/////////继承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));