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 @Override 107 public void onScaleEnd(ScaleGestureDetector detector) 108 { 109 // TODO Auto-generated method stub 110 111 } 112 113 } 114 115 }
复制代码

运行该程序:

 

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

 

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

 

放大图片:

 

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


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值