手势其实是一个比较复杂的东西,首先是因为处理的时机。Android中触摸屏的事件其实只有ACTION_DOWN、ACTION_MOVE和 ACTION_UP这三种,当然我们实现手势的逻辑时,一般会用到GestureDetector,它有许多封装好的事件回调接口,比如onFling、 onLongPress、onScroll等,其实这些事件只是对上面那三个基本时间的包装而已:即三个基本事件按一定的序列出现,则会触发响应的 GestureDetector中的事件,比如ACTION_DOWN 加上三个ACTION_MOVE再加上ACTION_UP就是一次Fling事件等等。

虽然手势能给用户带来比较新奇好玩的体验,GestureDetector这样的接口很容易理解,但是却也有很多问题,主要是自定义手势时。假如我们要实现一个自定义的手势,即当用户在触摸屏上画圆时响应我们的事件处理逻辑,那么当用户画圆时,其实也是一个Scroll事件,这时候就不太好确定到底响应画圆事件还是Scroll事件了。

手势带来的另一个问题是UI的体验,大多数情况下我们需要考虑到用户手指移动的加速度、反馈、期望等,比如快速的滑动和低速的滑动给用户的心理预期是完全不同的,这方面做得比较完美的要数MacBook上的TouchPad了,从单指移动鼠标、双指窗口内移动,到三指窗口间切换、四指返回Home,给用户的体验算是十分优秀的了。当然这都是交互的内容了,不再过多讨论,一般产品中也不建议做太复杂的手势。

一般情况下我们用的比较多的手势就是单指拖拽、双指缩放图片这样的简单手势,下面的代码是ImageView实现单指和双指这两种手势的代码,没有用到GestureDetector,而是仅仅对onTouch事件进行处理:
注:ImageView 中要添加 android:scaleType="matrix"

float mCurrentScale = 1;
float last_x = -1;
float last_y = -1;

mImage.setOnTouchListener(new OnTouchListener() {
   float baseValue;

@Override
   public boolean onTouch(View v, MotionEvent event) {
   // TODO Auto-generated method stub
   // return ArtFilterActivity.this.mGestureDetector.onTouchEvent(event);
   if (event.getAction() == MotionEvent.ACTION_DOWN) {
        baseValue = 0;
       float x = last_x = event.getRawX();
       float y = last_y = event.getRawY();
   }
   else if (event.getAction() == MotionEvent.ACTION_MOVE) {
       if (event.getPointerCount() == 2) {
           float x = event.getX(0) - event.getX(1);
           float y = event.getY(0) - event.getY(1);
           float value = (float) Math.sqrt(x * x + y * y);// 计算两点的距离
           if (baseValue == 0) {
                baseValue = value;
           }
           else {
               if (value - baseValue >= 10 || value - baseValue <= -10) {
                   float scale = value / baseValue;// 当前两点间的距离除以手指落下时两点间的距离就是需要缩放的比例。
                   img_scale(scale);  //缩放图片
               }
           }
       }
       else if (event.getPointerCount() == 1) {
           float x = event.getRawX();
           float y = event.getRawY();
            x -= last_x;
            y -= last_y;
           if (x >= 10 || y >= 10 || x <= -10 || y <= -10)
                img_transport(x, y); //移动图片位置
               last_x = event.getRawX();
                last_y = event.getRawY();
           }
       }
       else if (event.getAction() == MotionEvent.ACTION_UP) {

}
       return true;
   }
});

Android手势:单指拖动、双指缩放图片相关推荐

  1. Android Image单指滑动双指缩放功能

    在android app开发过程中,对于单指滑动,双指缩放功能的实现,也是常用的功能 在对ImageView的处理中,可以自定义ImageView在onTouch事件中对单指和双指缩放处理,也可以 注 ...

  2. 【Unity开发小技巧】模型单指旋转双指缩放功能代码(多种情况)

    欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群 1.pc端通过鼠标中键调整相机的FieldOfView属性的值(会发生形变不建议) void Update(){if (Inp ...

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

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

  4. 移动端图片单指移动,双指放大缩小实现//touchmove的时候不让body滚动

    移动端图片单指移动,双指放大缩小实现//touchmove的时候不让body滚动 思路1:移动放大缩小操作都直接放到图片上面 图片的放大缩小使用transform的scale属性操作,移动使用tran ...

  5. Android拖动和缩放图片

    Android拖动和缩放图片 2014年5月9日 我们在使用应用其中常常须要浏览图片.比方在微信其中.点击图片之后能够对图片进行缩放. 本博客介绍怎样对图片进行拖拽和缩放.这首先要了解Android中 ...

  6. Android开发之View双指缩放ViewGroup双指缩放视频双指缩放图片双指缩放

    老套路先上图 核心代码使用view的缩放API即可 setScaleX(scale); setScaleY(scale); 在看下自定义可缩放的view package cn.xiayiye5.xia ...

  7. 微信小程序实现双指缩放图片功能

    前言 本文分析怎么在微信小程序实现双指缩放图片的功能. 实现过程 1. 文件index.wxml和index.wxss代码如下,这一块比较简单,可自行查看,不做过多分析: <!--index.w ...

  8. Unity触控——单指、双指、Windows大屏多人触控

    前段时间做了个Windows系统的大屏触控程序,最多同时支持十点触控,并且在各自的小窗口中要分别处理,即每个小窗口中的触点为一个处理组,判断其单点或多点操作.按以往移动端程序的触屏事件Input.Ge ...

  9. 移动端js实现双指缩放,单指拖动图片

    1.可通过修改图片的宽高来缩放图片 2.可通过修改transform进行缩放图片,使用transform默认的作用中心是元素的中心点,需要通过transform-origin:0 0调整作用中心点 3 ...

最新文章

  1. 运行webpack命令每次提示安装webpack-cli
  2. nagios部署安装中篇
  3. java mqtt paho_使用eclipse paho在java端实现MQTT消息的收发(客户端与服务端实例)...
  4. 关于信用管理--信用更新
  5. numpy.cov()和numpy.var()的用法
  6. form、document.all[].value的数字处理
  7. 【Android开发坑系列】之事件
  8. shell文件管理jenkins构建过程---window环境下报错:找不到shell文件
  9. php实现姓名按首字母排序的类与方法
  10. protected访问权限_权限修饰符 /重写
  11. python 图形库介绍_数据分析Python手绘图形库有哪些
  12. 实力封装:Unity打包AssetBundle(三)
  13. linux彻底清除历史记录
  14. MySQL8 设置远程访问授权
  15. 硬盘安装arch linux,ArchLinux硬盘安装
  16. 华硕h410csm怎么开启_昂达h410主板装win7系统及bios设置教程(首发支持10代cpu)
  17. 《全民攻城》开心周末,好礼相赠
  18. 悟透delphi 第二章 DELPHI与WIN32时空
  19. PHP-商品价格计算
  20. 物联网中,北向接口和南向接口是什么?

热门文章

  1. Windows 7简介
  2. ActivityNet数据集简介及下载分享(百度网盘)
  3. java dbcp连接池 使用_Java使用DBCP连接池
  4. 代码是使用计算机的什么,什么是计算机的STOP代码-万兴恢复专家
  5. 养老院室内定位不再成为困扰——新导智能
  6. 9宫格解锁 android_Android实现九宫格解锁的实例代码
  7. 01-css经典布局整理-圣杯布局
  8. cva《财务建模》第六讲笔记
  9. AcEdCommand 直接发送CAD自身命令
  10. android性能优化的相关视频资料