这里利用一个Path对象保存所有的触摸轨迹:
package com.tobacco.touchdraw;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.SurfaceHolder.Callback;
import android.view.View.OnTouchListener;
public class LSurfaceView extends SurfaceView implements Callback,OnTouchListener,Runnable{
private SurfaceHolder sfh;
private Canvas canvas;
private Paint paint;
//private float lastX,lastY;
private Path path1;
//private Path path2;
private boolean flag;
public LSurfaceView(Context context) {
super(context);
sfh=this.getHolder();
sfh.addCallback(this);
paint=new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStrokeWidth(4);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeCap(Paint.Cap.ROUND);
path1=new Path();
//path2=new Path();
}
public void myDraw(MotionEvent e){
int action=e.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
path1.moveTo(e.getX(),e.getY());
//lastX=e.getX();
//lastY=e.getY();
break;
case MotionEvent.ACTION_MOVE:
path1.lineTo(e.getX(),e.getY());
//lastX=e.getX();
//lastY=e.getY();
break;
case MotionEvent.ACTION_UP:
//path.quadTo(lastX,lastY,e.getX(),e.getY());
//path2=new Path(path1);
//path1.close();
break;
}
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
flag=true;
setOnTouchListener(this);
new Thread(this).start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag=false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
myDraw(event);
return true;
}
@Override
public void run() {
while(flag){
long start=System.currentTimeMillis();
canvas=sfh.lockCanvas();
if(canvas!=null){
canvas.drawPath(path1,paint);
//canvas.drawPath(path2,paint);
sfh.unlockCanvasAndPost(canvas);
}
long end=System.currentTimeMillis();
try{
if(end-start<30){
Thread.sleep(30-(end-start));
}
}
catch(Exception e){
}
}
}
}