ScaleGestureDetector之手势缩放

概述

  根据接收的MotionEvent, 侦测由多个触点(多点触控)引发的变形手势。callback方法 ScaleGestureDetector.OnScaleGestureListener 会在特定手势事件发生时通知用户。该类仅能和Touch事件引发的MotionEvent配合使用。使用该类需要
  为你的View创建ScaleGestureDetector 实例
  确保在onTouchEvent(MotionEvent)方法中调用 onTouchEvent (MotionEvent). [译者注:前者为该类的onTouchEvent方法,后者为View的onTouchEvent方法。] 在事件发生时,定义在callback中的方法会被调用。

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.      android:layout_width="fill_parent"  
  4.      android:layout_height="fill_parent"  
  5.      android:orientation="vertical" >  
  6.    
  7.      <Button   
  8.          android:id="@+id/button"  
  9.          android:layout_width="fill_parent"  
  10.          android:layout_height="wrap_content"  
  11.          android:text="显示图片"  
  12.          />  
  13.        
  14.      <SurfaceView   
  15.          android:id="@+id/surfaceview"  
  16.          android:layout_width="fill_parent"  
  17.          android:layout_height="fill_parent"  
  18.          />  
  19.    
  20.  </LinearLayout>  
java文件,主要是实现按钮的监听和定义一个类实现ScaleGestureDetector.OnScaleGestureListener接口:
[java] view plain copy
 print?
  1. package com.kingfly;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Color;  
  8. import android.graphics.Matrix;  
  9. import android.graphics.Rect;  
  10. import android.os.Bundle;  
  11. import android.view.MotionEvent;  
  12. import android.view.ScaleGestureDetector;  
  13. import android.view.SurfaceHolder;  
  14. import android.view.SurfaceView;  
  15. import android.view.View;  
  16. import android.widget.Button;  
  17.   
  18. public class ShoushiActivity extends Activity {  
  19.   
  20.     private Button mButton = null;  
  21.     private SurfaceView mSurfaceView = null;  
  22.     private SurfaceHolder mSurfaceHolder = null;  
  23.     private ScaleGestureDetector mScaleGestureDetector = null;  
  24.     private Bitmap mBitmap = null;  
  25.   
  26.     /** Called when the activity is first created. */  
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.   
  32.         mSurfaceView = (SurfaceView) this.findViewById(R.id.surfaceview);  
  33.         mSurfaceHolder = mSurfaceView.getHolder();  
  34.         mScaleGestureDetector = new ScaleGestureDetector(this,  
  35.                 new ScaleGestureListener());  
  36.         mButton = (Button) this.findViewById(R.id.button);  
  37.         // 按钮监听  
  38.         mButton.setOnClickListener(new View.OnClickListener() {  
  39.   
  40.             public void onClick(View v) {  
  41.                 // TODO Auto-generated method stub  
  42.                 mBitmap = BitmapFactory.decodeResource(getResources(),  
  43.                         R.drawable.mmm);  
  44.                 // 锁定整个SurfaceView  
  45.                 Canvas mCanvas = mSurfaceHolder.lockCanvas();  
  46.                 // 画图  
  47.                 mCanvas.drawBitmap(mBitmap, 0f, 0f, null);  
  48.                 // 绘制完成,提交修改  
  49.                 mSurfaceHolder.unlockCanvasAndPost(mCanvas);  
  50.                 // 重新锁一次  
  51.                 mSurfaceHolder.lockCanvas(new Rect(0000));  
  52.                 mSurfaceHolder.unlockCanvasAndPost(mCanvas);  
  53.             }  
  54.         });  
  55.   
  56.     }  
  57.   
  58.     @Override  
  59.     public boolean onTouchEvent(MotionEvent event) {  
  60.         // 返回给ScaleGestureDetector来处理  
  61.         return mScaleGestureDetector.onTouchEvent(event);  
  62.     }  
  63.   
  64.     public class ScaleGestureListener implements  
  65.             ScaleGestureDetector.OnScaleGestureListener {  
  66.   
  67.         public boolean onScale(ScaleGestureDetector detector) {  
  68.             // TODO Auto-generated method stub  
  69.   
  70.             Matrix mMatrix = new Matrix();  
  71.             // 缩放比例  
  72.             float scale = detector.getScaleFactor() / 3;  
  73.             mMatrix.setScale(scale, scale);  
  74.   
  75.             // 锁定整个SurfaceView  
  76.             Canvas mCanvas = mSurfaceHolder.lockCanvas();  
  77.             // 清屏  
  78.             mCanvas.drawColor(Color.BLACK);  
  79.             // 画缩放后的图  
  80.             mCanvas.drawBitmap(mBitmap, mMatrix, null);  
  81.             // 绘制完成,提交修改  
  82.             mSurfaceHolder.unlockCanvasAndPost(mCanvas);  
  83.             // 重新锁一次  
  84.             mSurfaceHolder.lockCanvas(new Rect(0000));  
  85.             mSurfaceHolder.unlockCanvasAndPost(mCanvas);  
  86.   
  87.             return false;  
  88.         }  
  89.   
  90.         public boolean onScaleBegin(ScaleGestureDetector detector) {  
  91.             // TODO Auto-generated method stub  
  92.             // 一定要返回true才会进入onScale()这个函数  
  93.             return true;  
  94.         }  
  95.   
  96.         public void onScaleEnd(ScaleGestureDetector detector) {  
  97.             // TODO Auto-generated method stub  
  98.   
  99.         }  
  100.   
  101.     }  
  102.   
  103. }  

原文地址:https://www.cnblogs.com/vegetate/p/9997235.html