链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/11/2390274.html

一、概述

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 }

运行该程序:

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

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

放大图片:

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

PS:图片来源于互联网

Android应用开发基础篇(16)-----ScaleGestureDetector(缩放手势检测)的更多相关文章

  1. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

  2. Android应用开发基础篇(3)-----ListView

    一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView ...

  3. Android应用开发基础篇(4)-----TabHost(选项卡)

    一.概述 TabHost是一种用来显示标签的组件,不清楚?看一下来电通这个应用就知道了.这个组件用起来与其他组件不太一样,它需要继承TabActivity这个类,还有它的布局文件与我们平时用的也有些不 ...

  4. Android应用开发基础篇(14)-----自定义标题栏

    一.概述 每一个应用程序默认的标题栏(注意与状态栏的区别)只有一行文字(新建工程时的名字),而且颜色.大小等都是固定的,给人的感觉比较单调.但当程序需要美化的时候,那么修改标题栏是就是其中一项内容,虽 ...

  5. Android应用开发基础篇(13)-----GestureDetector(手势识别)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/05/2381025.html 一.概述 GestureDetector是一个用于识别手势的类,这 ...

  6. Android应用开发基础篇(11)-----ViewFlipper

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/01/2376067.html 一.概述 ViewFlipper这个部件是用来实现多页显示的,多页 ...

  7. Android应用开发基础篇(8)-----SurfaceView

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/25/2368069.html 一.概述 SurfaceView也是一个用来画图的部件,不过由于它 ...

  8. Android应用开发基础篇(12)-----Socket通信

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌 ...

  9. Android应用开发基础篇(12)-----Socket通信(转载)

    转自:http://www.devdiv.com/android_socket_-blog-258060-10594.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络 ...

随机推荐

  1. Solr学习(2) Solr4.2.0+IK Analyzer 2012

    Solr学习(二) Solr4.2.0+IK Analyzer 2012 开场白: 本章简单讲述如何在solr中配置著名的 IK Analyzer 分词器. 本章建立在 Solr学习(一)  基础上进 ...

  2. CC++初学者编程教程(3) 安装VS2010 boost标准库开发环境

    1.      BOOST编译过程非常复杂,目前为了学习BOOST,首先搭建基于VS2010的BOOST开发环境. Boost库 8 9. 10. 11 12 13 14 15. 16. 17. 18 ...

  3. Unix/Linux环境C编程入门教程(2) CentOS环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 本文就带大家来安装CentOS并且配置好C/C++开发环境,这是一款Linux. ...

  4. android中退出当前应用程序的四种方法

    android中退出当前应用程序的四种方法 [IT168 技术]Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何 ...

  5. HTML系列(七):多媒体

    一.video标签 H5新增了video实现在线播放视频的功能: 代码示例: <video controls="controls"> <source src=&q ...

  6. Deep Learning(深度学习)学习笔记整理系列之(四)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  7. matlab GUI之常用对话框(二)-- 进度条的使用方法

    常用对话框(二) 进度条   waitbar 调用格式: h = waitbar(x,'message')  waitbar(x,'message','CreateCancelBtn','button ...

  8. SQL XML process

    declare @data xml set @data=' <bookstore> <book category="COOKING"> <title ...

  9. 红豆带你从零学C#系列之:使用集合组织相关数据

    ArrayList(数组列表) Why:如果一个公司有5名员工,一般我们会用长度为5的对象数组来存储信息,但要是有新员工来了,5个长度的数组就不够用了,因此我们需要一种能够根据需要自动分配容量的动态数 ...

  10. WinSock网络编程基础(3)server

    上一篇讲的是简单的发送数据的客户端的实现.接下来讲的是如何实现收发数据服务器.这里说的服务器其实就是一个进程,它需要等待任意数量的客户端与之建立起连接,以便响应它们的请求. 服务器必须在已知的名称上监 ...