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 }

运行该程序:

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

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

放大图片:

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

时间: 2024-10-05 08:15:29

Android之ScaleGestureDetector(缩放手势检测)的相关文章

android的ScaleGestureDetector缩放类详解

文章由多出组合,它们来自: http://elvajxw.iteye.com/blog/1308452 http://www.cnblogs.com/lknlfy/archive/2012/03/11/2390274.html 类概述       根据接收的 MotionEvent,  侦测由多个触点(多点触控)引发的变形手势.callback 方法ScaleGestureDetector.OnScaleGestureListener  会在特定手势事件发生时通知用户. 该类仅能和Touch事件

Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图片,简单介绍了下Matrix:具体请参考:Android 手势检测实战 打造支持缩放平移的图片预览效果(上):本篇继续完善我们的ImageView~~ 首先加入放大后的移动~~ 1.自由的进行移动 我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以移动~~~ @Ov

Chromium网页输入事件捕捉和手势检测过程分析

连续的输入事件可能会产生一定的手势操作,例如滑动手势和捏合手势.在Chromium中,网页的输入事件是在Browser进程中捕捉的.Browser进程捕获输入事件之后,会进行手势操作检测.检测出来的手势操作将会发送给Render进程处理,因为它们需要应用在网页之上.与此同时,Browser进程也会将原始的输入事件发送给Render进程处理.本文接下来就分析Browser进程处理网页输入事件的过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 接下来我们

手势检测(一)

Android为手势检测提供了一个GestureDetector类,GestureDetector实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDetector.OnGestureListener实例,其中GestureDetector.OnGestureListener就是一个监听器,负责对用户的手势行为提供响应. 一.API 1.GestureDetector类 (1)功能简介:该类通过使用提供的MotionEvents用于检测各种手势事件,当检测到

Android图片的缩放效果

一.概述 Android 图片要实现:手势滑动,双击变大,多点触控的效果. 其实是有一定难度的,我们需要用Matrix ,GestureDetector 等等需要完成一个复杂的逻辑才能实现,然而今天我要说的并不是这种方法,而是一个第三方库Photoview,它使得完成图片缩放工作只需要3-5行代码就搞定了. 是不是很爽... 二.使用方法 github:https://github.com/chrisbanes/PhotoView 如果用AS需在引入如下库文件(目前是最新的): dependen

HTML5 手势检测原理和实现

前言 随着 Hybrid 应用的丰富,HTML5 工程师们已经不满足于把桌面端体验简单移植到移动端,他们觊觎移动原生应用人性化的操作体验,特别是原生应用与生俱来的丰富的手势系统.HTML5 没有提供开箱即用的手势系统,但是提供了更底层一些的对 touch 事件的监听.基于此,我们可以做出自己的手势库. 手势 常用的 HTML5 手势可以分为两类,单点手势和两点手势.单点手势有 tap(单击),double tap(双击),long tap(长按),swipe(挥),move(移动).两点手势有

9.3、Libgdx手势检测

(官网:www.libgdx.cn) 触摸屏在输入的基础上增加了手势检测,比如两个手指实现缩放,单击或双击屏幕,长按屏幕等. Libgdx提供了GestureDetector来帮助你检测以下手势: touchDown:用户触摸屏幕. longPress:用户长按屏幕. tap:用户点击屏幕.手指必须在点击初始化的位置不能移动太大. pan:用户滑动手指穿过屏幕. panStop:当pan结束时调用. fling:用户滑动手指穿过屏幕,然后释放.通常是用于滑动检测. zoom:用户使用两个手指移动

使用Android的硬件缩放技术优化执行效率

Unity3D研究院之使用Android的硬件缩放技术优化执行效率 http://www.xuanyusong.com/archives/3205 Android中GLSurfaceView在横竖屏切换时重新创建表面缓冲导致的问题 http://blog.k-res.net/archives/1702.html https://stackoverflow.com/questions/7185644/android-opengl-crazy-aspect-ratio-after-sleep

android关于图片缩放

网上有许多关于图片缩放的demo,本人都感觉不怎么好用,最近在github看到了 一个简单的支持多指缩放图片的Android View类 gesture-imageview (地址:https://github.com/jasonpolites/gesture-imageview),感觉还挺好用的,现在写个demo方便以后用于调用 第一步:添加库,推荐直接下载zip,导入工程后,直接将main里的com.polites.android包直接复制到自己的工程中,方便自己以后修改 第二步:由于我只需