一、概述

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 }

运行该程序:

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

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

放大图片:

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

 

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

  1. Android应用开发基础篇(16)-----ScaleGestureDetector(缩放手势检测)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/11/2390274.html 一.概述 ScaleGestureDetector这个类是专门用来 ...

  2. android的ScaleGestureDetector缩放类详解

    文章由多出组合,它们来自: http://elvajxw.iteye.com/blog/1308452 http://www.cnblogs.com/lknlfy/archive/2012/03/11 ...

  3. 缩放手势 ScaleGestureDetector 源码解析,这一篇就够了

    其实在我们日常的编程中,对于缩放手势的使用并不是很经常,这一手势主要是用在图片浏览方面,比如下方例子.但是(敲重点),作为 Android 入门的基础来说,学习 ScaleGestureDetecto ...

  4. android学习笔记52——手势Gesture,增加手势、识别手势

    手势Gesture,增加手势 android除了提供了手势检测之外,还允许应用程序把用户手势(多个持续的触摸事件在屏幕上形成特定的形状)添加到指定文件中,以备以后使用 如果程序需要,当用户下次再次画出 ...

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

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...

  6. Android实现支持缩放平移图片

    本文主要用到了以下知识点 Matrix GestureDetector 能够捕捉到长按.双击 ScaleGestureDetector 用于检测缩放的手势 自由的缩放 需求:当图片加载时,将图片在屏幕 ...

  7. 看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!

    引言 在 android 开发过程中,我们经常需要对一些手势,如:单击.双击.长按.滑动.缩放等,进行监测.这时也就引出了手势监测的概念,所谓的手势监测,说白了就是对于 GestureDetector ...

  8. 9.3、Libgdx手势检测

    (官网:www.libgdx.cn) 触摸屏在输入的基础上增加了手势检测,比如两个手指实现缩放,单击或双击屏幕,长按屏幕等. Libgdx提供了GestureDetector来帮助你检测以下手势: t ...

  9. Android图片的缩放效果

    一.概述 Android 图片要实现:手势滑动,双击变大,多点触控的效果. 其实是有一定难度的,我们需要用Matrix ,GestureDetector 等等需要完成一个复杂的逻辑才能实现,然而今天我 ...

随机推荐

  1. SQL Server 数据库最小宕机迁移方案

    一.目的 在做SQL Server数据库维护的时候,当上司要求我们把几十G的数据文件搬动到其它服务器,并且要求最小宕机时间的时候,我们有没什么方案可以做到这些要求呢? 在这里我们假设这两台机器并不是在 ...

  2. Week1 Team Homework #2: Introduction of each team member

    王洛书 我是来自浙江的王洛书.热爱历史,热爱美食,热爱代码,热爱博物馆.很喜欢软件工程这门课的上课方式,也很喜欢组里的这些同学.希望能大家一起努力,在这门课上真正地收获能力上的提升!   陈睿翊

  3. python SendMail 发送邮件

    最近在学习python 时,用到了发送邮件的操作,通过整理总结如下: 1.普通文本邮件 普通文本邮件发送的实现,关键是要将MIMEText中_subtype设置为plain,首先导入smtplib和m ...

  4. Codeforces Round #311 (Div. 2) D. Vitaly and Cycle 奇环

    题目链接: 点这里 题目 D. Vitaly and Cycle time limit per test1 second memory limit per test256 megabytes inpu ...

  5. 2012 Asia Hangzhou Regional Contest

    Friend Chains http://acm.hdu.edu.cn/showproblem.php?pid=4460 图的最远两点距离,任意选个点bfs,如果有不能到的点直接-1.然后对于所有距离 ...

  6. WebStorm 9 注册码

    UserName:William ===== LICENSE BEGIN ===== 45550-12042010 00001SzFN0n1bPII7FnAxnt0DDOPJA INauvJkeVJB ...

  7. linux系统清空文件内容

    本文转载至:http://www.jbxue.com/LINUXjishu/14410.html 本文介绍下,在linux系统中,清空文件内容的方法,使用cat命令.echo命令,将文件内容截断为0字 ...

  8. Maintainable HashCode and Equals Using Apache Commons

    Java hashCode and equals methods can be tricky to implement correctly. Fortunately, all majors IDEs ...

  9. 从svn删除文件夹和文件

    由于项目开始放在自己项目组的一个服务器上,而且svn也是自己在该服务器上搭建的,但是不知道是什么原因,svn上的代码被误删了.为了更稳定地使用svn,所以使用公司的svn来管理代码. 运维将不是最新版 ...

  10. python 利用pop3接收邮件并保存附件

    def SaveAttach():# login the pop3 server ,retrive the new mails ,and download the attachments dstdir ...