public class MultiTouch extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new MultiTouchView(this));
}
}
class MultiTouchView extends SurfaceView implements Callback,Runnable{
private SurfaceHolder mSurfaceHolder;
private Thread mThread;
private Canvas mCanvas;
private Paint mPaint;
private boolean mFlag;
private float mOldScaleRate=1;
private float mScaleRate=1;
private float mNewDistance;
private float mOldDistance;
private Bitmap mBitmap;
private int mScreenW;
private int mScreenH;
public MultiTouchView(Context context) {
super(context);
mSurfaceHolder=this.getHolder();
mSurfaceHolder.addCallback(this);
mPaint=new Paint();
mPaint.setColor(Color.WHITE);
mPaint.setAntiAlias(true);
mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.icon);
setFocusable(true);
setFocusableInTouchMode(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mScreenW=this.getWidth();
mScreenH=this.getHeight();
mFlag=true;
mThread=new Thread(this,"My Thread");
mThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mFlag=false;
}
@Override
public void run() {
while (mFlag) {
long start=System.currentTimeMillis();
myDraw();
logic();
long end=System.currentTimeMillis();
if ((end-start)<50) {
try {
Thread.sleep(50-(end-start));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private void logic() {
// TODO Auto-generated method stub
}
private void myDraw() {
try {
mCanvas=mSurfaceHolder.lockCanvas();
if (mCanvas != null) {
mCanvas.drawColor(Color.WHITE);
mCanvas.save();
mCanvas.scale(mScaleRate, mScaleRate, mScreenW/2, mScreenH/2);
mCanvas.drawBitmap(mBitmap, mScreenW/2-mBitmap.getWidth()/2, mScreenH/2-mBitmap.getHeight()/2, mPaint);
mCanvas.restore();
}
} catch (Exception e) {
// TODO: handle exception
}finally{
if(mCanvas != null){
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
requestFocus();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_UP:
mOldScaleRate=mScaleRate;
break;
case MotionEvent.ACTION_POINTER_DOWN:
mOldDistance = getEventSpace(event);
break;
case MotionEvent.ACTION_MOVE:
if (event.getPointerCount()==2) {
mNewDistance = getEventSpace(event);
if (mOldDistance != 0) {
mScaleRate = mOldScaleRate * mNewDistance / mOldDistance;
}
}
return true;
default:
break;
}
return true;
//return super.onTouchEvent(event);
}
private float getEventSpace(MotionEvent event) {
float disX=event.getX(1)-event.getX(0);
float disY=event.getY(1)-event.getY(0);
return FloatMath.sqrt(disX*disX+disY*disY);
}
}
问题一:
当手指进行多点触摸的时候,无法进入相应的case语句进行执行,刚开始以为是没有加setFocusableInTouchMode(true);,但是发现即使加了这句话还是不能正常的执行,经过几次尝试发现是因为
@Override public boolean onTouchEvent(MotionEvent event) { requestFocus(); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_POINTER_UP: mOldScaleRate=mScaleRate; break; case MotionEvent.ACTION_POINTER_DOWN: mOldDistance = getEventSpace(event); break; case MotionEvent.ACTION_MOVE: if (event.getPointerCount()==2) { mNewDistance = getEventSpace(event); if (mOldDistance != 0) { mScaleRate = mOldScaleRate * mNewDistance / mOldDistance; } } return true; default: break; } return true; //return super.onTouchEvent(event); } 应该返回return true;而不是return super.onTouchEvent(event);API解释:- Returns:
- True if the event was handled, false otherwise.