0. 前言  

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52462493

Android开发中,我们常常需要获取用户的手势操作事件,从而回调相应的方法完成我们的逻辑业务,在讲手势识别之前,我们有必要了解一下View相关的位置属性。

1.  View位置属性

View是一种界面上控件的一种抽象,代表了一个控件。View有很多位置属性。

如图所示,我们的View位置主要由4个定点决定。四个属性分别为left(1),top(2),right(3),bottom(4)。

数字为图上标出的距离。显然这四个属性是相对于父容器来定的,均可以通过get()方法获取。

因此很容易得出View本身的宽高:

width = getRight() - getLeft();
height = getBottom() – getTop();

需要注意的是,View在平移时,上述四个属性值是不会变的,即维护了原始的位置信息。

那么当View平移时,我们用什么属性来描述View相当于屏幕的位置变化?

从Android3.0开始,View新加了几个位置参数,分别为x,y,translationX,translationY。而这四个值是会改变的。

前两者表示View移动后相对于父容器左上角的坐标。后两者表示View移动前后相对于父容器的偏移量,默认为0。

2.   View的触摸事件

当用户触摸屏幕时,可能发生按下(ACTION_DOWN),移动(ACTION_MOVE)以及抬起(ACTION_UP)三种事件。

下面介绍一些重用的关于触摸事件的数据获取。

 

2.1   获取事件发生位置

我们可以通过通过getX/Y(相对于当前View左上角的坐标)、getRawX/Y(相对于屏幕左上角的坐标)获取按下或抬起事件发生的位置。

getX()//获取点击事件相对View本身x轴方向的距离
getY()//获取点击事件相对View本身y轴方向的距离
getRawX()//获取点击事件相对整个屏幕左边的x轴方向的距离
getRawY()//获取点击事件相对整个屏幕左边的y轴方向的距离

2.2   滑动

对于滑动,这里有一个最小滑动距离的概念。小于该值系统不会认为这是滑动事件。

只要有滑动,必然有滑动速度的概念。我们可以使用VelocityTracker测量滑动速度。

//最小滑动距离
ViewConfiguration.get(getContext()).getScaledTouchSlop();
//获取滑动速度
//在onTouchEvent中使用VelocityTracker
VelocityTracker vt = VelocityTracker.obtain();
vt.addMovement(event);
//速度为100ms内滑动过的像素值,和我们理解的每秒滑动像素值的速度概念不同
//同样的滑动速度,指定时间不一样,速度也不同,另外速度可为负
vt.computeCurrentVelocity(100);
int Vx = (int)vt.getXVelocity();
int Vy = (int)vt.getYVelocity();
//资源回收
vt.clear();
vt.recycle();

2.3   手势检测

在实际开发中,我们完全可以在onTouchEvent()中实现监听点击、抬起、滑动等行为。Android SDK给我们提供了GestureDetector,通过这个类的onTouchEvent(event)方法我们可以识别更多的手势,比如双击事件等等。

GestureDetector的使用示例:

/*
*@author SEU_Calvin
*@date 2010/09/10
*/
private GestureDetector mGestureDetector = new GestureDetector(this, new MyGestureListener());
//长按后可以拖动View
mGestureDetector.setIsLongpressEnabled(false);@Override
public boolean onTouchEvent(MotionEvent event) {//接管onTouchEvent方法return mGestureDetector.onTouchEvent(event);
}class MyGestureListener extends GestureDetector.SimpleOnGestureListener {@Overridepublic boolean onDown(MotionEvent ev) {Log.d("onDown", ev.toString());return true;}//如果手指向左滑,左上角横坐标已经为负了,但是onScroll方法的distanceX为正的,同理右滑distanceX为负,Y轴也一样是反的@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {Log.d("onScroll", e1.toString());return true;}@Overridepublic void onLongPress(MotionEvent ev) {Log.d("onLongPress", ev.toString());}@Overridepublic boolean onSingleTapUp(MotionEvent ev) {Log.d("onSingleTapUp", ev.toString());return true;}@Overridepublic void onShowPress(MotionEvent ev) {Log.d("onShowPress ", ev.toString());}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {Log.d("onFling e1 ",e1.toString());Log.d("onFling e2 ",e2.toString());return true;}@Overridepublic boolean onDoubleTap(MotionEvent e) {Log.d("onDoubleTap",e.toString());return super.onDoubleTap(e);}@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {Log.d("onSingleTapConfirmed",e.toString());return super.onSingleTapConfirmed(e);}
}

上例中的SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,这个类实现了OnGestureListener,OnDoubleTapListener两个接口。该类是static class,也就是说它实际上是一个外部类,因此我们可以在外部继承这个类,重写里面的手势处理方法。

在看输出结果之前,先对实例中的回调方法进行总结:

表格上已经把各个回调方法解释的很清楚了,这里需要介绍一下为什么双击时不会触发onSingleTapConfirmed,在第一次单击按下时,会给Hanlder发送了一个延时300ms的消息,如果300ms里,发生了第二次单击事件,那就认为是双击事件,并移除之前发送的延时消息。否则判定为触发SingleTapConfirmed。

上例的输出结果(可以自行结合上表进行分析):

(1)单次点击:

(2)长按:

(3)双击:

(4)滑动:

(5)快速滑动:

从滑动和快速滑动的结果来看,GestureDetector都没有“回应”抬起事件的回调。

如果业务逻辑需要我们去“回应”,我们自己在onTouchEvent()中做处理即可。

@Override
public boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);mGestureDetector.onTouchEvent(event);//GestureDetector处理滑动的同时,自己处理抬起UP事件switch(event.getAction()){case MotionEvent.ACTION_UP://UP事件处理break;//...//其他处理}
}

至此关于识别用户在屏幕上的手势介绍完毕。

转载请标明出处:http://blog.csdn.net/seu_calvin/article/details/52462493

Android开发——用户在屏幕上的手势识别相关推荐

  1. android项目中使用的服务器上,android 开发中使用okhttp上传文件到服务器

    开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片. 使用okhttp会是一个很好的选择.它使用很简单,而且运行效率也很高. 首先,在 app/build.gradle 的 ...

  2. Android开发实践:屏幕旋转的处理

    最近开发Android Camera相关的程序,被屏幕旋转搞得头大,一方面得考虑屏幕旋转后布局的变化,另一方面得搞清楚屏幕的旋转方向.角度与Camera的Preview角度的关系.本来通过重载Acti ...

  3. Android开发--用户定位服务--UserLocation

    用户定位介绍: User Location的作用: 1.获取用户的位置 2.追踪用户的移动 User Location的关键API 1.Location Manager:用于管理Android的用户定 ...

  4. Android开发系列之屏幕密度和单位转换

    由于Android的开源性,所以目前市面上面Android手机的分辨率特别多,这样的话就给我适配带来了一定的难度.要想做好适配,我们首先应该明白什么是分辨率.PPI.屏幕大小等概念,还有在不同的屏幕密 ...

  5. android广播内容显示在屏幕上,在Android本机来电屏幕上弹出窗口,例如真正的来电者Android应用...

    我也在努力(在这里理解你可能是错误的).您想要实现的是在Android 4.2(Jelly Bean)中显示该活动.我只是延迟显示活动.我在其他类中使用过PhoneStateListener.我可以在 ...

  6. android开发获取手机屏幕分辨率

    android开发基础过程中获取手机屏幕分辨率用来加载不同的UI,图片等,如何获取手机屏幕分辨率? DisplayMetrics displayMetrics=new DisplayMetrics() ...

  7. 电脑开机卡在android,如何修复它:Android卡在引导屏幕上-万兴恢复专家

    第2部分:一键解决方案,以修复Android卡在启动屏幕中 当修复Android卡在启动屏幕中的常用方法没有任何好处时,如何选择最佳方法呢? 使用dr.fone - Repair(Android),您 ...

  8. Android开发时手机屏幕实时同步显示在电脑上

    1.下载 Android Screen Monitor http://code.google.com/p/android-screen-monitor/ (1) 下載 ASM_2_40.zip 并解压 ...

  9. android开发——用户头像

    最近,小灵狐得知了一种能够加快修炼速度的绝世秘法,那便是修炼android神功.小灵狐打算用android神功做一个app,今天他的修炼内容就是头像功能.可是小灵狐是个android小白啊,所以修炼过 ...

最新文章

  1. SAP质量管理模块常见问题及解决方案
  2. 使用阿里云容器服务Jenkins 2.0实现持续集成之the tag you want篇(updated on 2017.09.06)...
  3. ai软件基础教程自学网,怎么快速学会ai软件
  4. java sqlite sqlite_busy_sqlite3 busy timeout
  5. Intel Edison 基础开发之配置第一个小程序
  6. Postgresql杂谈 10—Postgresql中的分区表
  7. 七夕妈妈生辰,岁月,请你善待妈妈
  8. Day357358359360.JVM监控及诊断工具-GUI -JVM
  9. 进阶项目(12)PS2键盘驱动程序设计讲解
  10. 单片机设计:基于stm32智能语音识别蓝牙音响(ld3320语音识别模块+mp3模块+喇叭+点阵屏+OLED+蓝牙+手机app)
  11. 声学参数-基频-Librosa标准: 基频的文字定义和用librosa提取wav文件基频
  12. 小米10S MIUI13.0.3线刷12.5.14
  13. 生活随记 - 祝你生日快乐
  14. 计算机垃圾回收站桌面上找不到,桌面上的回收站不见了怎么办?桌面上的回收站不见了解决方法...
  15. JavaScript语言精粹--读书笔记三之replace()与正则
  16. 递增数列(迭代加深搜索)
  17. 成年人必须看的5个故事
  18. Steinberg Nuendo 12 WiN+MAC 高级音频后期制作软件
  19. Place官网购物协议分析
  20. php实现搜索框链接数据库数据

热门文章

  1. 罗马数字 java_java将罗马数字转换成整数算法详解-Fun言
  2. 京东之鉴:兄弟是兄弟,员工是员工!-千氪
  3. 多线程下载王者荣耀高清壁纸(过程超详细)
  4. 速收藏 !回复审稿人意见时常用的英文套话
  5. javascript获取本周、本月、本季度、本年时间
  6. JS获取特殊字符前面的字符串
  7. 提示错误Cannot read properties of null (reading ‘value‘)
  8. (一)职业规划和制定计划
  9. “5G通达,AI赋能“ AI在网络规划中的应用实践(人工智能应用案例)
  10. 现代微服务拆分与设计