文章由多出组合,它们来自:

http://elvajxw.iteye.com/blog/1308452

http://www.cnblogs.com/lknlfy/archive/2012/03/11/2390274.html

类概述

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

(ScaleGestureDetector 为 Android2.2 新增的类,允许 Views 可以通过提供的MotionEvents 检测和处理包括多点触摸在内的手势变化信息。)

内部类

       interface  ScaleGestureDetector.OnScaleGestureListener
       手势发生时接收通知的监听器

class ScaleGestureDetector.SimpleOnScaleGestureListener      
       一个方便使用的类。 若仅想监听一部分尺寸伸缩事件,可继承该类。

  公共构造方法

public ScaleGestureDetector(Context context, ScaleGestureDetector.OnScaleGestureListener listener)

构造函数
       公共方法

public float getCurrentSpan ()

       返回手势过程中,组成该手势的两个触点的当前距离。
       返回值
       以像素为单位的触点距离。

  public long getEventTime ()

返回事件被捕捉时的时间。
       返回值
       以毫秒为单位的事件时间。

public float getFocusX ()

返回当前手势焦点的 X 坐标。 如果手势正在进行中,焦点位于组成手势的两个触点之间。 如果手势正在结束,焦点为仍留在屏幕上的触点的位置。若 isInProgress()返回 false,该方法的返回值未定义。
       返回值
       返回焦点的 X 坐标值,以像素为单位。

public float getFocusY ()

       返回当前手势焦点的 Y 坐标。 如果手势正在进行中,焦点位于组成手势的两个触点之间。 如果手势正在结束,焦点为仍留在屏幕上的触点的位置。若 isInProgress()返回 false,该方法的返回值未定义。
       返回值
       返回焦点的 Y 坐标值,以像素为单位。

  public float getPreviousSpan ()

返回手势过程中,组成该手势的两个触点的前一次距离。
       返回值
       两点的前一次距离,以像素为单位。

public float getScaleFactor ()

返回从前一个伸缩事件至当前伸缩事件的伸缩比率。该值定义为  (getCurrentSpan()  / getPreviousSpan())。
       返回值
       当前伸缩比率.

public long getTimeDelta ()

返回前一次接收到的伸缩事件距当前伸缩事件的时间差,以毫秒为单位。
       返回值
       从前一次伸缩事件起始的时间差,以毫秒为单位。

public boolean isInProgress ()

如果手势处于进行过程中,返回 true.
       返回值
       如果手势处于进行过程中,返回 true。否则返回 false。

简单示例:

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

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical" >
 
     <Button
         android:id="@+id/button"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text="显示图片"
         />
    
     <SurfaceView
         android:id="@+id/surfaceview"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         />
 
 </LinearLayout>

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

package com.nan.scale;
 
 import android.app.Activity;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 import android.view.View;
 import android.widget.Button;
 
 
 
 public class MyScaleActivity extends Activity
 {
     private Button mButton = null;
     private SurfaceView mSurfaceView = null;
     private SurfaceHolder mSurfaceHolder = null;
     private ScaleGestureDetector mScaleGestureDetector = null;
     private Bitmap mBitmap = null;   
    
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
        
         mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceview);
         mSurfaceHolder = mSurfaceView.getHolder(); 
         mScaleGestureDetector = new ScaleGestureDetector(this,new ScaleGestureListener());
         mButton = (Button)this.findViewById(R.id.button);
         //按钮监听
         mButton.setOnClickListener(new View.OnClickListener()
         {
            
             @Override
             public void onClick(View v)
             {
                 // TODO Auto-generated method stub
                 mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mmm);
                 //锁定整个SurfaceView
                 Canvas mCanvas = mSurfaceHolder.lockCanvas();
                 //画图
                 mCanvas.drawBitmap(mBitmap, 0f, 0f, null);
                 //绘制完成,提交修改
                 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
                 //重新锁一次
                 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
                 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
             }
         });
        
     }
    
     @Override
     public boolean onTouchEvent(MotionEvent event)
     {           
         //返回给ScaleGestureDetector来处理
         return mScaleGestureDetector.onTouchEvent(event);
     }
    
    
     public class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener
     {
 
         @Override
         public boolean onScale(ScaleGestureDetector detector)
         {
             // TODO Auto-generated method stub
            
             Matrix mMatrix = new Matrix();       
             //缩放比例
             float scale = detector.getScaleFactor()/3;
             mMatrix.setScale(scale, scale);
            
             //锁定整个SurfaceView
             Canvas mCanvas = mSurfaceHolder.lockCanvas();
             //清屏
             mCanvas.drawColor(Color.BLACK);
             //画缩放后的图
             mCanvas.drawBitmap(mBitmap, mMatrix, null);
             //绘制完成,提交修改
             mSurfaceHolder.unlockCanvasAndPost(mCanvas);
             //重新锁一次
             mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
             mSurfaceHolder.unlockCanvasAndPost(mCanvas);
            
             return false;
         }
 
         @Override
         public boolean onScaleBegin(ScaleGestureDetector detector)
         {
             // TODO Auto-generated method stub   
             //一定要返回true才会进入onScale()这个函数
             return true;
         }
 
         @Override
         public void onScaleEnd(ScaleGestureDetector detector)
         {
             // TODO Auto-generated method stub
            
         }
        
     }
     
 }

android的ScaleGestureDetector缩放类详解的更多相关文章

  1. Android开发之MediaRecorder类详解

    MediaRecorder类介绍: MediaRecorder类是Android sdk提供的一个专门用于音视频录制,一般利用手机麦克风采集音频,摄像头采集图片信息. MediaRecorder主要函 ...

  2. Android开发 Html工具类详解

    前言 在一些需求富文本显示或者编辑的开发情况下,数据都是用html的格式来保存文本信息的.而google是有提供解析html的工具类那就是Html.有了Html可以让TextView也支持富文本(其实 ...

  3. Android游戏开发之旅 View类详解

    Android游戏开发之旅 View类详解 自定义 View的常用方法: onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) ...

  4. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  5. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  6. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  7. Android 之窗口小部件详解--App Widget

    Android 之窗口小部件详解--App Widget  版本号 说明 作者 日期  1.0  添加App Widge介绍和示例  Sky Wang 2013/06/27        1 App ...

  8. [Android新手区] SQLite 操作详解--SQL语法

    该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...

  9. QAction类详解:

    先贴一段描述:Qt文档原文: Detailed Description The QAction class provides an abstract user interface action tha ...

随机推荐

  1. python学习小结6:模块

    模块:在Python中有一个概念叫做模块(module),简单地说,模块就是一个保存了Python代码的文件.          模块能定义函数,类和变量,模块里也能包含可执行的代码.         ...

  2. OpenWrt刷机后LAN口无法连通的问题

    [路由器开发板硬件固件配置] MTK双频:MT7620a + MT7612e 内存:256 MB 闪存:16 MB 固件:MTK自带SDK中的OpenWrt固件(mtksdk-openwrt-2.6. ...

  3. android开发之socket快传文件以及消息返回

    应用场景: 两台android机器:一台自建wifi热点,另一台搜索到,连接该wifi热点.之后再通过socket传递消息,文件等,当服务器端接收到消息之后会返回对应的应答消息: 注意点:接收到消息之 ...

  4. asp.net中的mysql传参数MySqlParameter

    注意在asp.net中传参 string sql="select name,id from user where id=@id"; //@idm不需要引号 MySqlParamet ...

  5. MyEclipse 2015 Stable 1.0下载安装破解日志

    前言 这2天下载了许多myeclipse版本,基本上是14/15版本的,各种破解均告以失败,这次下载了贴吧一个吧友提供的版本,现已破解.破解结果现不好说--目前已装SVN,根据经验,只有等待一定时间验 ...

  6. Mysql登录异常的一个问题:

    问题描述: 正常在启动mysql的时候是这样的: 1. win打开输入界面: 2. 输入cmd命令,鼠标右键选择“以管理员身份运行”: 3, 之后再在界面输入登录mysql的登录语句: mysq -u ...

  7. [转载]App.Config详解及读写操作

    App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是c ...

  8. [转载]C# ListView用法详解

    一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设 ...

  9. PHP对XML添加节点之appendChild()方法讲解

    问题如下:<b > <c>test</c> </b>我要在b节点里面添加一个子节点比如说加一个d节点,要实现成<b > <c>t ...

  10. 弱弱的玩下Javascript

    前言 好久没有更新博客了,也蛮少捣弄javascript,今儿看到一个题目,关于给你一个面板,你可以随意的在上面画矩形,可以移动和删除任意一个你创建的矩形,心血来潮搞着玩哈,实现起来挺简单的,但这代码 ...