简单的多点触摸放缩图片

  1. public class MultiTouch extends Activity{  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         // TODO Auto-generated method stub  
  6.         super.onCreate(savedInstanceState);  
  7.         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  8.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  9.         setContentView(new MultiTouchView(this));  
  10.     }  
  11. }  
  12.   
  13. class MultiTouchView extends SurfaceView implements Callback,Runnable{  
  14.     private SurfaceHolder mSurfaceHolder;  
  15.     private Thread mThread;  
  16.     private Canvas mCanvas;  
  17.     private Paint mPaint;  
  18.     private boolean mFlag;  
  19.     private float mOldScaleRate=1;  
  20.     private float mScaleRate=1;  
  21.     private float mNewDistance;  
  22.     private float mOldDistance;  
  23.     private Bitmap mBitmap;  
  24.     private int mScreenW;  
  25.     private int mScreenH;  
  26.   
  27.     public MultiTouchView(Context context) {  
  28.         super(context);  
  29.         mSurfaceHolder=this.getHolder();  
  30.         mSurfaceHolder.addCallback(this);  
  31.         mPaint=new Paint();  
  32.         mPaint.setColor(Color.WHITE);  
  33.         mPaint.setAntiAlias(true);  
  34.         mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.icon);  
  35.         setFocusable(true);  
  36.         setFocusableInTouchMode(true);  
  37.     }  
  38.   
  39.     @Override  
  40.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  41.             int height) {  
  42.         // TODO Auto-generated method stub  
  43.           
  44.     }  
  45.   
  46.     @Override  
  47.     public void surfaceCreated(SurfaceHolder holder) {  
  48.         mScreenW=this.getWidth();  
  49.         mScreenH=this.getHeight();  
  50.         mFlag=true;  
  51.         mThread=new Thread(this,"My Thread");  
  52.         mThread.start();  
  53.     }  
  54.   
  55.     @Override  
  56.     public void surfaceDestroyed(SurfaceHolder holder) {  
  57.         mFlag=false;  
  58.     }  
  59.   
  60.     @Override  
  61.     public void run() {  
  62.         while (mFlag) {  
  63.             long start=System.currentTimeMillis();  
  64.             myDraw();  
  65.             logic();  
  66.             long end=System.currentTimeMillis();  
  67.             if ((end-start)<50) {  
  68.                 try {  
  69.                     Thread.sleep(50-(end-start));  
  70.                 } catch (InterruptedException e) {  
  71.                     // TODO Auto-generated catch block  
  72.                     e.printStackTrace();  
  73.                 }  
  74.             }  
  75.         }  
  76.     }  
  77.   
  78.     private void logic() {  
  79.         // TODO Auto-generated method stub  
  80.           
  81.     }  
  82.   
  83.     private void myDraw() {  
  84.         try {  
  85.             mCanvas=mSurfaceHolder.lockCanvas();  
  86.             if (mCanvas != null) {  
  87.                 mCanvas.drawColor(Color.WHITE);  
  88.                 mCanvas.save();  
  89.                 mCanvas.scale(mScaleRate, mScaleRate, mScreenW/2, mScreenH/2);  
  90.                 mCanvas.drawBitmap(mBitmap, mScreenW/2-mBitmap.getWidth()/2, mScreenH/2-mBitmap.getHeight()/2, mPaint);  
  91.                 mCanvas.restore();  
  92.             }  
  93.         } catch (Exception e) {  
  94.             // TODO: handle exception  
  95.         }finally{  
  96.             if(mCanvas != null){  
  97.                 mSurfaceHolder.unlockCanvasAndPost(mCanvas);  
  98.             }  
  99.         }  
  100.     }  
  101.       
  102.     @Override  
  103.     public boolean onTouchEvent(MotionEvent event) {  
  104.         requestFocus();  
  105.         switch (event.getAction() & MotionEvent.ACTION_MASK) {  
  106.         case MotionEvent.ACTION_POINTER_UP:  
  107.             mOldScaleRate=mScaleRate;  
  108.             break;  
  109.         case MotionEvent.ACTION_POINTER_DOWN:  
  110.             mOldDistance = getEventSpace(event);  
  111.             break;  
  112.         case MotionEvent.ACTION_MOVE:  
  113.             if (event.getPointerCount()==2) {  
  114.                 mNewDistance = getEventSpace(event);  
  115.                 if (mOldDistance != 0) {  
  116.                     mScaleRate = mOldScaleRate * mNewDistance / mOldDistance;  
  117.                 }  
  118.             }  
  119.             return true;  
  120.         default:  
  121.             break;  
  122.         }  
  123.         return true;  
  124.         //return super.onTouchEvent(event);  
  125.     }  
  126.   
  127.     private float getEventSpace(MotionEvent event) {  
  128.         float disX=event.getX(1)-event.getX(0);  
  129.         float disY=event.getY(1)-event.getY(0);  
  130.         return FloatMath.sqrt(disX*disX+disY*disY);  
  131.     }  
  132. }  

问题一:

当手指进行多点触摸的时候,无法进入相应的case语句进行执行,刚开始以为是没有加setFocusableInTouchMode(true);,但是发现即使加了这句话还是不能正常的执行,经过几次尝试发现是因为

  1. @Override  
  2.     public boolean onTouchEvent(MotionEvent event) {  
  3.         requestFocus();  
  4.         switch (event.getAction() & MotionEvent.ACTION_MASK) {  
  5.         case MotionEvent.ACTION_POINTER_UP:  
  6.             mOldScaleRate=mScaleRate;  
  7.             break;  
  8.         case MotionEvent.ACTION_POINTER_DOWN:  
  9.             mOldDistance = getEventSpace(event);  
  10.             break;  
  11.         case MotionEvent.ACTION_MOVE:  
  12.             if (event.getPointerCount()==2) {  
  13.                 mNewDistance = getEventSpace(event);  
  14.                 if (mOldDistance != 0) {  
  15.                     mScaleRate = mOldScaleRate * mNewDistance / mOldDistance;  
  16.                 }  
  17.             }  
  18.             return true;  
  19.         default:  
  20.             break;  
  21.         }  
  22.         return true;  
  23.         //return super.onTouchEvent(event);  
  24.     }  
应该返回return true;而不是return super.onTouchEvent(event);API解释:

Returns:
True if the event was handled, false otherwise.
问题二:

  1. case MotionEvent.ACTION_MOVE:  
  2.         mNewDistance = getEventSpace(event);  
  3.     if (mOldDistance != 0) {  
  4.         mScaleRate = mNewDistance / mOldDistance;  
  5.     }  
  6.         return true;  
之前是按照上面的方法做的,发现图片是可以进行放缩,但是放所的不正常

  1. case MotionEvent.ACTION_MOVE:  
  2.             if (event.getPointerCount()==2) {  
  3.                 mNewDistance = getEventSpace(event);  
  4.                 if (mOldDistance != 0) {  
  5.                     mScaleRate = mOldScaleRate * mNewDistance / mOldDistance;  
  6.                 }  
  7.             }  
  8.             return true;  
改成上面的做法后正常了,我每次在抬起手指也就是触发MotionEvent.ACTION_POINTER_UP的时候应该将上一次的放缩比例保存起来,下一次计算放缩比例的时候应该在这个的基础上进行放缩。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值