关于如何处理手势操作以及那四个基本固定的顺序我就不讲解了,这里直接跳到我们获得瞬间滑动后回调onFling()这个抽象函数时,应该如何根据参数比较准确的判断滑动方向。如果你没有前面的基础知识,你可以去看看这篇文章:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html

我看到网上大部分资料,对这个抽象函数的实现都是相当简单的:

1
2
3
4
5
6
@Override  
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  float velocityY) {  
   
//dosomething 
returnfalse;  
}

这些文章其实能解决的问题只有一个,那就是教你如何能在有手势操作的时候,捕获到这个动作,却没有去分析这个动作。

其实要真正能分析手势,需要处理好这四个参数MotionEvent e1, MotionEvent e2, float velocityX, float velocityY

 先来看一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private int verticalMinDistance = 20; 
private int minVelocity         = 0; 
    
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    
    if(e1.getX() - e2.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) { 
    
        // 切换Activity 
        // Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class); 
        // startActivity(intent); 
        Toast.makeText(this,"向左手势", Toast.LENGTH_SHORT).show(); 
    }elseif (e2.getX() - e1.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) { 
    
        // 切换Activity 
        // Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class); 
        // startActivity(intent); 
        Toast.makeText(this,"向右手势", Toast.LENGTH_SHORT).show(); 
    
    
    returnfalse
}

OnFling的四个参数意思分别为

e1: The first down motion event that started the fling.手势起点的移动事件
e2: The move motion event that triggered the current onFling.当前手势点的移动事件
velocityX: The velocity of this fling measured in pixels per second along the x axis.每秒x轴方向移动的像素
velocityY: The velocity of this fling measured in pixels per second along the y axis.每秒y轴方向移动的像素

说的更简单点就是,鼠标手势相当于一个向量(当然有可能手势是曲线),e1为向量的起点,e2为向量的终点,velocityX为向量水平方向的速度,velocityY为向量垂直方向的速度

1
if(e1.getX()
- e2.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity)

则上面的语句能知道啥意思了吧,就是说向量的水平长度(滑了有多长)必须大于verticalMinDistance,并且水平方向速度大于minVelocity。

从而我们可以如此判断手势是否满足一定的条件从而进行相应响应,也可以根据这个写出更复杂的手势判断。

虽然我这篇文章不去探究手势操作的基本步凑,但还是有必要谈谈我们的listenner在重载onTouch()这个函数的时候应该思考的问题:

1
2
3
public
boolean onTouch(View v, MotionEvent event) {   
    returnmGestureDetector.onTouchEvent(event);   
}

查看GestureDetector类的onTouchEvent的源码就能知道,进入该函数后会进入case MotionEvent.ACTION_UP这个路径,从而调用onFling函数。

我要说的就是这句话,因为在我看来GestureDetector未必能满足处理所有的手势需求,肯能有那么一天,需要我们抛开GestureDetector   直接在onTouch()里面完成任务。

Android 屏幕手势滑动中onFling()函数的技巧分析的更多相关文章

  1. Android:实现手势滑动的事件处理方法

            首先得Activity必须实现OnGestureListener接口,该接口提供了关于手势操作的一些方法, onDown方法:onDown是,一旦触摸屏按下,就马上产生onDown事件 ...

  2. Android移动应用开发中常见的经验技巧总结

    转:http://wwwdevstorecn/essay/essayInfo/6128.html 1. 对话保持的解决方案. 要求: 1.app中使用webview访问具体网站的内容,但是app与服务 ...

  3. javaScript中with函数用法实例分析

    javaScript 中的 with 函数 ,即所谓的with 语句,可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性,要给对象创建新的属性,必须明确地引用该对象. with 函 ...

  4. javascript 手势(swipeLeft,swipeRight)滑动中使用css3动画卡顿,开启硬件加速

    今天,在做一个移动端项目,遇到了css3动画卡顿的现象. 例图: 在手势滑动中(swipeLeft,swipeRight)遇到了动画卡顿的现象,最后使用了css3动画-webkit-transform ...

  5. Android开发之手势滑动(滑动手势监听)详解

    Android开发之手势滑动(滑动手势监听)详解 在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListen ...

  6. Android 实现两屏幕互相滑动

    Android 实现两屏幕互相滑动 下文来自: http://blog.csdn.net/song_shi_chao/article/details/7081664 ----------------- ...

  7. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fen ...

  8. Android手势滑动Tab

    Android手势滑动Tab //MainActivity.java public class MainActivity extends TabActivity { ; ; ; private Ges ...

  9. Android Studio怎样查看资源或者函数在哪些类中被引用

    很多人在做完Keymap匹配到Eclispe快捷键后,发现查看资源或者函数在哪些地方被引用的快捷键"Ctrl+Shift+G"不灵 了.你选中某个函数后,使用这个快捷键.发现仅仅会 ...

随机推荐

  1. 身在上海的她,该不该继续"坚持"前端开发?

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 对于目前的IT行业,我实在不想她还没在这个行业中站稳脚跟就开始有 ...

  2. Linux mount 命令进阶

    笔者在<Linux mount 命令>一文中介绍了 mount 命令的基本用法,本文我们接着介绍 mount 命令的一些高级用法,比如 bind mounts(绑定挂载)和 shared ...

  3. 利用 John the Ripper 破解用户登录密码

    一.什么是 John the Ripper ? 看到这个标题,想必大家都很好奇,John the Ripper 是个什么东西呢?如果直译其名字的话就是: John 的撕裂者(工具). 相比大家都会觉得 ...

  4. Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...

  5. “耐撕团队”部署并测试onezero团队记帐本项目

    耐撕团队 对onezero团队记帐本项目的部署并测试 测试指标参见下面给出的博客: http://www.ltesting.net/ceshi/ceshijishu/xncs/2014/1030/20 ...

  6. Linux 实验一 基础实践

    Linux 实践一 1:软件源的维护方法 删掉DEB打头的 在命令行中输入命令时,可以用命令补全的方法. 下载完成后,使用sudo dpkg-i skype.deb 来完成安装. 2:掌握Linux ...

  7. jeecg中vaildfrom的复杂的表单校验

    简介 jeecg生成的页面都是使用validfrom组件来确保数据的完整性和准确性. 凡要验证格式的元素均需绑定datatype属性,datatype可选值内置有10类,用来指定不同的验证格式. 如果 ...

  8. NopCommerce源码架构

    我们承接以下nop相关的业务,欢迎联系我们. 我们承接NopCommerce定制个性化开发: Nopcommerce二次开发 Nopcommerce主题开发 基于Nopcommerce的二次开发的电子 ...

  9. CI框架--数据库Query_Builder中的方法

    下面是DB_Query_Builder.php中,各个方法的声明: 选择字段(select) public function select($select = '*', $escape = NULL) ...

  10. Activiti启动某个流程失败,页面报500

    现象:Activiti启动某个流程失败,页面报500,错误日志如下. 2017-06-19 10:50:09 [org.activiti.engine.impl.interceptor.Command ...