博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android应用开发基础篇(16)-----ScaleGestureDetector(缩放手势检测)
阅读量:5301 次
发布时间:2019-06-14

本文共 4506 字,大约阅读时间需要 15 分钟。

链接地址:

一、概述

      ScaleGestureDetector这个类是专门用来检测两个手指在屏幕上做缩放的手势用的,最简单的应用就是用来缩放图片或者缩放网页。

 

二、要求

     利用ScaleGestureDetector这个类实现图片缩放。

 

三、实现

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

1 
2
6 7
13 14
19 20

修改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:图片来源于互联网

转载于:https://www.cnblogs.com/wvqusrtg/p/5179068.html

你可能感兴趣的文章
SQL学习_查询重复数据和连接多个表数据的方法
查看>>
Json转Dictionary
查看>>
java课程设计---彩票销售管理系统
查看>>
关于SQL Server镜像的一个小误区
查看>>
“chm 已取消到该网页的导航”解决方案
查看>>
多活动练习--人品计算器
查看>>
Sass快速入门学习笔记
查看>>
js题集30--隔三位一点函数测试代码
查看>>
正则表达式校验YYYYMMDD
查看>>
树的同构
查看>>
HDU-1163Eddy's digital Roots,九余定理的另一种写法!
查看>>
Android驱动学习-app调用内核驱动过程(驱动框架回顾)
查看>>
2018.03.29 python-pandas 数据透视pivot table / 交叉表crosstab
查看>>
JMeter打开脚本失败 如何解决?
查看>>
初识memcached
查看>>
【BZOJ1271】秦腾的教学评估
查看>>
Javascript闭包演示
查看>>
BZOJ4018: 小Q的幻想之乡
查看>>
多进程服务器中,epoll的创建应该在创建子进程之后
查看>>
记那些年我们走过蛮荒时代,运维旁观者说
查看>>