Android实现通过手势控制图片大小缩放的方法

本文实例讲述了Android实现通过手势控制图片大小缩放的方法。分享给大家供大家参考,具体如下:

该程序实现的是通过手势来缩放图片,从左向右挥动图片时图片被放大,从右向左挥动图片时图片被缩小,挥动速度越快,缩放比越大。程序思路如下:在界面中定义一个ImageView来显示图片,使用一个GestureDetector来检测用户的手势,并根据用户的手势在横向的速度来缩放图片。

在介绍这个实例前,先介绍一下Android中处理手势触摸事件的大概框架。

一、添加语句实现OnGestureListener手势监听器,代码如下:

public classGestureZoom extends Activity implements OnGestureListener

二、定义一个手势监听器的全局实例,并在onCreate函数中对其进行初始化,代码如下:

GestureDetector detector;
@Override
public void onCreate(Bundle savedInstanceState)
{
  ... ...
  detector = new GestureDetector(this);
}

三、重写onTouchEvent函数,把本Activity的触摸事件交给GestureDetector处理,代码如下:

@Override
public boolean onTouchEvent(MotionEvent me)
{
  return detector.onTouchEvent(me);
}

四、重写你需要监听的手势的函数,默认包括如下几种手势:

BooleanonDown(MotionEvent e):按下。
BooleanonFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):拖过、滑动。
abstract voidonLongPress(MotionEvent e):长按。
BooleanonScroll(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滚动。
voidonShowPress(MotionEvent e):按下且未移动和松开。
BooleanonSingleTapUp(MotionEvent e):轻击。

这几种手势是系统默认提供的,根据描述大家可能还是不太明确这几种手势,最好的方法就是大家可以实现一个简单的程序实验一下就明白了。当然,除了这些默认的手势,也可以自行添加手势,篇幅有限就不再赘述了。

接下来给出通过滑动来实现图片缩放的实例,对比上面给出的基本框架,其实就是重写了onFling函数,在其中定义了如何处理滑动事件。

首先定义除了手势监听器外一些全局对象,并在onCreate函数中做相应的初始化:

GestureDetectordetector;
ImageViewimageView;
Bitmap bitmap;//保存图片资源
int width,height;// 记录图片的宽、高
floatcurrentScale = 1;// 记录当前的缩放比
Matrix matrix;//控制图片缩放的Matrix对象
@Override
public voidonCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    detector = new GestureDetector(this);
    imageView = (ImageView)findViewById(R.id.show);
    matrix = new Matrix();
    bitmap =BitmapFactory.decodeResource(this.getResources(), <你的图片资源>);//获取被缩放的源图片,因为不能对原有图片进行修改,所以必须转化为位图
    width = bitmap.getWidth();
    height = bitmap.getHeight();
    imageView.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), <你的图片资源>));//设置ImageView初始化时显示的图片
}

一、触摸时间绑定手势监听器,和前面是一样的,就不再贴代码了。

二、重写onFling函数:

@Override
publicboolean onFling(MotionEvent event1, MotionEvent event2
, float velocityX, float velocityY)
{
   velocityX = velocityX > 4000 ? 4000 :velocityX;
   velocityX = velocityX < -4000 ? -4000: velocityX;
   //根据手势的速度来计算缩放比,如果velocityX>0,放大图像,否则缩小图像。
   currentScale += currentScale * velocityX/ 4000.0f;
   //保证currentScale不会等于0
   currentScale = currentScale > 0.01 ?currentScale : 0.01f;
   // 重置Matrix
   matrix.reset();
   // 缩放Matrix
   matrix.setScale(currentScale,currentScale , 160 , 200);
   BitmapDrawable tmp = (BitmapDrawable)imageView.getDrawable();
   //如果图片还未回收,先强制回收该图片
   if (!tmp.getBitmap().isRecycled())
   {
       tmp.getBitmap().recycle();
   }
   // 根据原始位图和Matrix创建新图片
   Bitmap bitmap2 =Bitmap.createBitmap(bitmap
       ,0, 0, width, height, matrix, true);
   // 显示新的位图
   imageView.setImageBitmap(bitmap2);
   return true;
}

布局文件仅仅添加了一个ImageView控件,大家自己画一下。在这里没有截图,因为截图也看不出效果,大家就自己试试吧。好了,至此就实现了通过手势滑动来实现图片缩放,以上内容学习自疯狂Android一书。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android视图View技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android实现屏幕锁定源码详解

    最近有朋友问屏幕锁定的问题,自己也在学习,网上找了下也没太详细的例子,看的资料书上也没有有关屏幕锁定程序的介绍,下个小决心,自己照着官方文档学习下,现在做好了,废话不多说,先发下截图,看下效果,需要注意的地方会加注释,有问题的朋友可以直接留言,我们共同学习交流,共同提高进步!直接看效果图: 一:未设置密码时进入系统设置的效果图如下: 二:设置密码方式预览: 三:密码解密效果图 四:九宫格解密时的效果图 下面来简单的看下源码吧,此处讲下,这个小DEMO也是临时学习下的,有讲的不明白的地方请朋友直接

  • Mac Android Studio快捷键整理

    为了提高工作效率,特地的整理了MAC 版 Android Studio 快捷键的整理,如果后续还有,在继续补充! ⌥-> option|alt ⇧->shift ⌃->control ⌘->command ⎋->esc ↑↓←→ Code  alt+F7:Find usage alt+command+L:格式化代码 alt+control+O:优化import(去掉无用的import) command+O:Override Methods command+I:Implemen

  • Mac中Eclipse连不上Android手机的解决方法

    现象是: Windows下Eclipse可以连接Device里能显示设备名称,但是在Mac OS X下的Eclipse Device始终不能显示连接. 解决方法: 1.把Android手机开启调试模式,然后连接在我们的Mac OS上. 2.选择Mac的 关于本机->更多信息-> 系统报告->找到usb选项,右边会出现一系列和usb相关的设备我们找到自己的Android设备并选中. 3.选中后找到 供应商ID或叫厂商ID,我的MX4手机显示的供应商ID是:0x2a45 4.打开Mac终端

  • android中对文件加密解密的实现

    现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多.防止有人交一份钱,把所有的课件就拷给了别人.这样的事情培训机构肯定是不愿意的.现在我项目里面也出了这么个需求.下面介绍一下我的实现. 文件加解密的流程及原理 1.加密方法:存储文件时,从输入流中截取文件的字节数组,对字节数组进行加密,至于加密的方式和算法就可以视需求而定了,然后把加密后的字节数组写入到文件中,最后生成加密后的文件: 2.解密方法:同加密方法一样,只不过是对字节数据进行解密

  • Mac OS下为Android Studio编译FFmpeg解码库的详细教程

    NDK部分 1.下载ndk 这里就一笔带过了. 2.解压ndk 不要解压,文件权限会出错.执行之,会自动解压,然后mv到想放的地方.我放到了"/usr/local/bin/android-ndk-r10d"(此目录之后用$NDK_DIR指代). 3.下载Ffmpeg 我下的是2.5.3版本. 4.解压Ffmpeg 解压Ffmpeg到$NDK_DIR/sources/ffmpeg-2.5.3. 5.修改Ffmpeg编译配置 在ffmpeg-2.5.3目录下把configure文件中的这几

  • Android开发之自定义View(视图)用法详解

    本文实例讲述了Android开发之自定义View(视图)用法.分享给大家供大家参考,具体如下: View类是Android的一个超类,这个类几乎包含了所有的屏幕类型.每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展.在游戏开发中往往需要自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要.在Android中,任何一个View类都只需重写onDraw 方法来实现界面显示,自定义的视图可以是复杂的3D实现,也可以是非常简单的文本形式等. 为了实现自定义View,需要创建

  • mac开发android环境搭建步骤图解

    1.Java JDK 需要先说明下,OS X系统是自带有Java JDK1.6的.不过这里我安装的是JDK7,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html.见下图: 下载后,双击安装,如下图: 2.ADT(Android Develop Bundle) 下载地址:http://developer.android.com/sdk/index.html 如下图: 下载成

  • android 获取本机的IP地址和mac物理地址的实现方法

    获取本机IP地址 public String getLocalIpAddress() { WifiManager wifiManager = (WifiManager) getSystemService(android.content.Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); try { return In

  • Android实现通过手势控制图片大小缩放的方法

    本文实例讲述了Android实现通过手势控制图片大小缩放的方法.分享给大家供大家参考,具体如下: 该程序实现的是通过手势来缩放图片,从左向右挥动图片时图片被放大,从右向左挥动图片时图片被缩小,挥动速度越快,缩放比越大.程序思路如下:在界面中定义一个ImageView来显示图片,使用一个GestureDetector来检测用户的手势,并根据用户的手势在横向的速度来缩放图片. 在介绍这个实例前,先介绍一下Android中处理手势触摸事件的大概框架. 一.添加语句实现OnGestureListener

  • Android中屏幕密度和图片大小的关系详解

    Android中屏幕密度和图片大小的关系详解 前言 Android中支持许多资源,包括图片(Bitmap),对应于bitmap的文件夹是drawable,除了drawable,还有drawable-ldpi.drawable-mdpi.drawable-hdpi.drawable-xhdpi.drawable-xxhdpi等,同一张图片放到上面不同的文件夹中是有区别的,比如一张100 * 100像素大小的图片,分别放在上述各个文件夹中,然后将其设置为ImageView(假设宽高都是wrap_co

  • css+js完美控制图片大小

    使用js和css讲图片的现实控制在固定的区域内,大于这个区域的等比例缩放,小于这个区域的居中显示. css+js完美控制图片大小 0 && image.height>0){ flag=true; if(image.width/image.height>= 400/400){ if(image.width>400){ ImgD.width=400; ImgD.height=(image.height*400)/image.width; }else{ ImgD.width=i

  • js用拖动滑块来控制图片大小的方法

    本文实例讲述了js用拖动滑块来控制图片大小的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv=Content-Type content="text/html;charset=gb2312"> <title&g

  • 网页里控制图片大小的相关代码

    1.用鼠标拖动来改变大小 <SCRIPT LANGUAGE="JavaScript">function resizeImage(evt,obj){newX=evt.xnewY=evt.yobj.width=newXobj.height=newY}</script><img src="7say.gif" ondrag="resizeImage(event,this)">2.用鼠标滚动控制图片大小 <img

  • JavaScript 控制字体大小设置的方法

    在做公司的官网的时候,新闻内页会有一个让浏览者自己调整文字大小的功能,因此在这个空闲时间,把这个功能整理下来: function setFontSize (id,content,params){ var oTarget = document.getElementById(id), content = document.getElementById(content), size = params.size || 14, maxSize = params.maxSize || 20, step =

  • Android编程实现PendingIntent控制多个闹钟的方法

    本文实例讲述了Android编程实现PendingIntent控制多个闹钟的方法.分享给大家供大家参考,具体如下: 要用 android.app.PendingIntent.getBroadcast(Context context, int requestCode, Intent intent)来实现控制多个闹钟,关键点在于其中的一个参数requestCode. 举例说明如下: public void setClock(){ if(lva.ids.equals("")||lva.ids

  • Android编程基于距离传感器控制手机屏幕熄灭的方法详解

    本文实例讲述了Android编程基于距离传感器控制手机屏幕熄灭的方法.分享给大家供大家参考,具体如下: 在现实生活中,打电话的时候手机挨着自己的头,屏幕会熄灭,这是为了不让自己的头按到什么手机键~ 这个功能可以使用距离传感器来实现 P-Sensor距离感应器,可以感应手机和人体距离.具体使用用途是在通话过程中打开P-Sensor,那么当手机屏幕贴近用户脸部时,就会自动感应出手机和人体距离是多少.当小于某一个值时,就会熄灭屏幕,不再接收用户触摸屏幕事件,从而有效的防止通话过程中误触摸事件的出现.

  • Android自定义TextView实现文字图片居中显示的方法

    最近有个需求是这样的,人民币的符号"¥"因为安卓手机系统的不一致导致符号不是完全一样,所以用美工的给的图片代替,考虑到用的地方比较多,所以想着写一个继承于线性布局的组合控件,后来一想,安卓中不是有TextView吗,这个自带图片的控件,后来写了个demo,因为我是用的MatchParent,导致问题出现,人民币符号不是和文字一样的居中,因此才有了这篇博文,让我们来自定义TextView吧,这个场景用的比较多. 分析下TextView的源码 我们先来分析下TextView的源码,因为Te

  • Android中利用matrix 控制图片的旋转、缩放、移动

    本文主要讲解利用android中Matrix控制图形的旋转缩放移动,具体参见一下代码: 复制代码 代码如下: /**  * 使用矩阵控制图片移动.缩放.旋转  */  public class CommonImgEffectView extends View { private Context context ;      private Bitmap mainBmp , controlBmp ;      private int mainBmpWidth , mainBmpHeight , c

随机推荐