首页 > 代码库 > Android之ScaleGestureDetector(缩放手势检测)

Android之ScaleGestureDetector(缩放手势检测)

一、概述

      ScaleGestureDetector这个类是专门用来检测两个手指在屏幕上做缩放的手势用的,最简单的应用就是用来缩放图片或者缩放网页。


二、要求

     利用ScaleGestureDetector这个类实现图片缩放。


三、实现

     新建工程MyScale,修改main.xml文件,在里面添加一个Button和一个SurfaceView,如下:

 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>

修改MyScaleActivity.java文件,主要是实现按钮的监听和定义一个类实现ScaleGestureDetector.OnScaleGestureListener接口:

 

  1 package com.nan.scale;  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  19  20 public class MyScaleActivity extends Activity  21 { 22     private Button mButton = null; 23     private SurfaceView mSurfaceView = null; 24     private SurfaceHolder mSurfaceHolder = null; 25     private ScaleGestureDetector mScaleGestureDetector = null; 26     private Bitmap mBitmap = null;     27      28     /** Called when the activity is first created. */ 29     @Override 30     public void onCreate(Bundle savedInstanceState)  31     { 32         super.onCreate(savedInstanceState); 33         setContentView(R.layout.main); 34          35         mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceview); 36         mSurfaceHolder = mSurfaceView.getHolder();   37         mScaleGestureDetector = new ScaleGestureDetector(this,new ScaleGestureListener()); 38         mButton = (Button)this.findViewById(R.id.button); 39         //按钮监听 40         mButton.setOnClickListener(new View.OnClickListener()  41         { 42              43             @Override 44             public void onClick(View v)  45             { 46                 // TODO Auto-generated method stub 47                 mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mmm); 48                 //锁定整个SurfaceView 49                 Canvas mCanvas = mSurfaceHolder.lockCanvas(); 50                 //画图 51                 mCanvas.drawBitmap(mBitmap, 0f, 0f, null); 52                 //绘制完成,提交修改 53                 mSurfaceHolder.unlockCanvasAndPost(mCanvas); 54                 //重新锁一次 55                 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0)); 56                 mSurfaceHolder.unlockCanvasAndPost(mCanvas); 57             } 58         }); 59          60     } 61      62     @Override 63     public boolean onTouchEvent(MotionEvent event) 64     {             65         //返回给ScaleGestureDetector来处理 66         return mScaleGestureDetector.onTouchEvent(event); 67     } 68      69      70     public class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener 71     { 72  73         @Override 74         public boolean onScale(ScaleGestureDetector detector)  75         { 76             // TODO Auto-generated method stub 77              78             Matrix mMatrix = new Matrix();         79             //缩放比例 80             float scale = detector.getScaleFactor()/3; 81             mMatrix.setScale(scale, scale); 82              83             //锁定整个SurfaceView 84             Canvas mCanvas = mSurfaceHolder.lockCanvas(); 85             //清屏 86             mCanvas.drawColor(Color.BLACK); 87             //画缩放后的图 88             mCanvas.drawBitmap(mBitmap, mMatrix, null); 89             //绘制完成,提交修改 90             mSurfaceHolder.unlockCanvasAndPost(mCanvas); 91             //重新锁一次 92             mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0)); 93             mSurfaceHolder.unlockCanvasAndPost(mCanvas); 94              95             return false; 96         } 97  98         @Override 99         public boolean onScaleBegin(ScaleGestureDetector detector) 100         {101             // TODO Auto-generated method stub    102             //一定要返回true才会进入onScale()这个函数103             return true;104         }105 106         @Override107         public void onScaleEnd(ScaleGestureDetector detector) 108         {109             // TODO Auto-generated method stub110             111         }112         113     }114      115 }

运行该程序:

 

点击一下“显示图片”按钮:

 

然后用两个手指缩小图片:

 

放大图片:

 

好了。可以发现,每次一开始缩放图片的时候都有一个突变,如果用来做应用的话这个程序还需要改善。


 

Android之ScaleGestureDetector(缩放手势检测)