转自:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html

Android的手势操作识别

时间:2012-10-20 23:09  来源:未知  作者:admin  点击: 282 次

摘要 首先,在Android系统中,每一次手势交互都会依照以下顺序执行。 1. 接触接触屏一刹那,触发一个MotionEvent事件。 2. 该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象。 3. 通过GestureDetector(手势识别器)转发次MotionEvent对象

首先,在Android系统中,每一次手势交互都会依照以下顺序执行。

1. 接触接触屏一刹那,触发一个MotionEvent事件。

2. 该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象。

3. 通过GestureDetector(手势识别器)转发次MotionEvent对象至OnGestureListener。

4. OnGestureListener获得该对象,听根据该对象封装的的信息,做出合适的反馈。

这个顺序可以说就是手势交互的原理,下面一同来了解一下MotionEvent、GestureDetector和OnGestureListener。

MotionEvent: 这个类用于封装手势、触摸笔、轨迹球等等的动作事件。其内部封装了两个重要的属性X和Y,这两个属性分别用于记录横轴和纵轴的坐标。

GestureDetector: 识别各种手势。

OnGestureListener: 这是一个手势交互的监听接口,其中提供了多个抽象方法,并根据GestureDetector的手势识别结果调用相对应的方法。

下面我再通过一个切换图片的代码示例,演示一下手势交互的实现,让大伙对上面的执行顺序,以及各手势动作的区分有一个更加深刻的了解和记忆。

首先,提供一个只有ImageView的布局文件——main.xml。

1
2
3
4
5
6
7
8
9
10
11
<?xml version= "1.0" encoding= "utf-8" ?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:orientation= "vertical"
android:layout_width= "fill_parent"
android:layout_height= "fill_parent" >
   
  <ImageView android:id= "@+id/image"
android:layout_width= "fill_parent"
android:layout_height= "fill_parent"
android:layout_gravity= "center" />
</LinearLayout>

然后,完成我们的Activity,因为要监听触摸屏的触摸事件和手势时间,所以该Activity必须实现OnTouchListener和OnGestureListener两个接口,并重写其中的方法。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public class MainActivity extends Activity implements OnTouchListener, OnGestureListener {
   
//创建一个用于识别收拾的GestureDetector对象waiyuwu.blogcn.com
private GestureDetector detector = new GestureDetector( this );
//定义一个数组,用于放漂亮的女孩
int[] girls = new int[]{R.drawable.girl1, R.drawable.girl2, R.drawable.girl3};
//定义数组下标,以方便观看各个女孩
private int index;
private ImageView image;
   
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
image = (ImageView)findViewById(R.id.image);
//设置一个初始显示的girl吧
image.setImageResource(girls[index]);
//监听这个ImageView组件上的触摸屏时间
image.setOnTouchListener( this );
//下面两个要记得设哦,不然就没法处理轻触以外的事件了,例如抛掷动作。
image.setLongClickable( true );
detector.setIsLongpressEnabled( true );
} //用于呼喊下一个女孩的方法
public void goNext(){
index++;
index = Math.abs(index % girls.length);
image.setImageResource(girls[index]);
}
   
//重写OnTouchListener的onTouch方法
//此方法在触摸屏被触摸,即发生触摸事件(接触和抚摸两个事件,挺形象)的时候被调用。
@Override
public boolean onTouch(View v, MotionEvent event) {
detector.onTouchEvent(event);
return true ;
}
   
//在按下动作时被调用
@Override
public boolean onDown(MotionEvent e) {
return false ;
}
   
//在抛掷动作时被调用
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
//velocityX表示横向的移动,根据手指移动的方向切换女孩
if (velocityX < 0){
goNext();
} else if (velocityX > 0){
goPrevious();
}
return false ;
}
   
//用户呼唤上一个女孩的方法
public void goPrevious(){
index--;
index = Math.abs(index % girls.length);
image.setImageResource(girls[index]);
}
   
//在长按时被调用
@Override
public void onLongPress(MotionEvent e) {
}
   
//在滚动时调用
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false ;
}
   
//在按住时被调用
@Override
public void onShowPress(MotionEvent e) {
}
   
//在抬起时被调用
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false ;
}
}

在刚开始学Android的时候,就觉得Google的文档不咋样,在研究手势时,更加的感觉Google的文档写得实在是太差了。很多常量, 属性和方法,居然连个描述都没有。没有描述也就罢了,但是OnGestureListener里手势这么多,它也没有一个介绍说明,在没有进行不断才尝试 之前,谁能搞懂onLongPress和onShowPress,onScroll和onFling的关系与差别吗?Google真的需要在文档方面做一 次大手术了。不过好在经过鄙人不断反复的尝试。从个人的角度为这几个手势动作做出了定义。

  • 按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。

  • 抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。

  • 长按(onLongPress): 手指按在持续一段时间,并且没有松开。

  • 滚动(onScroll): 手指在触摸屏上滑动。

  • 按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。

  • 抬起(onSingleTapUp):手指离开触摸屏的那一刹那。

除了这些定义之外,鄙人也总结了一点算是经验的经验吧,在这里和大家分享一下。

  • 任何手势动作都会先执行一次按下(onDown)动作。

  • 长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。

  • 按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。

  • 长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。

Android的手势操作识别相关推荐

  1. Android的手势操作(Gesture)

    上一篇介绍的onTouch提供的事件还是相对较简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦,因为我们要根据用户触摸的轨迹去判断是什么手势.幸好Android SDK给我们提供了Gesture ...

  2. android+p手势操作,手势操作哪家强:Android P对比iPhone X

    [环球网综合科技报道]据科技博客The Verge5月8日的博文称,Android P给谷歌的操作系统带来了大量的更新设计,其中最为突出的是新近推出的手势操作界面系统.很多人注意到该界面系统与苹果去年 ...

  3. android 手势旋转,android中手势操作图片的平移、缩放、旋转

    在网上搜到很多都是一样的版本,只有平移和缩放的功能.我在搜到的源代码基础上添加了旋转和边界检查的功能. 代码主要分两部分,一个activity一个view,代码如下: [java] package c ...

  4. 安卓10.0内测版现新版手势操作:很实用

    iOS和Android的手势操作进步越来越大.比如谷歌在Android 9 Pie上引入了原生的手势,当然,以小米.华为等为代表的OEM厂商也设计具有自身特色的解决方案. 比如原生安卓9.0上,传统的 ...

  5. Android中添加和识别手势操作

    实现思路:将手势写入GestureLibrary中,对其他手势进行匹配对比,进行识别 先在布局中加入GestureOverlayView组件 <android.gesture.GestureOv ...

  6. android手势操作滑动效果触摸屏事件处理

    2019独角兽企业重金招聘Python工程师标准>>> 很多时候,利用触摸屏的Fling.Scroll等Gesture(手势)操作来操作会使得应用程序的用户体验大大提升,比如用Scr ...

  7. android touch事件坐标原点,Android onTouch事件与手势操作

    触摸,手势操作已经很好的融入了我们的生活.那么Android开发中触摸事件要如何捕捉?如何处理?如何识别手势?事件的传递机制又是怎么样的?下面我们将通过一个小例子来进行这方面的学习. 先看效果图 如上 ...

  8. Android 触摸及手势操作GestureDetector

    现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘.无鼠标的手机系统带来了很多的便利.当用户触摸屏幕时会产生很多的触摸事件,down.up.move等等. ...

  9. Android - xml动画,识别手势动作,代码抽取,获取手机SIM卡串号,获取联系人数据,开机广播,发送/解析短信,报警音乐

    转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72878059 1.Activity的任务栈 1.类似一个木桶,每层只能放一个木块,我 ...

最新文章

  1. ThinkPHP读取数据库数据到模板文件
  2. JavaPairRDD方法中几种存储方式的坑
  3. eeglab教程系列(5)-预处理工具
  4. 帝国cms与mysql数据库_帝国CMS下在PHP文件中调用数据库类执行SQL语句实例
  5. PHP100视频教程2012版解压密码
  6. aop简介-aop的底层实现
  7. ubuntu下面的背光键盘的使用
  8. 【C语言简单说】十四:for循环
  9. JAVA 手撕底层arrayList代码(arrayList的简单实现)
  10. 千寻和省cors精度对比_使用中海达RTK实战演示千寻cors账号对比省cors网络,验证其测量效果究竟如何...
  11. lazarus的动态方法和虚拟方法
  12. texstudio 使用方法_TeXstudio怎么使用,TeXstudio使用教程解析
  13. HTTP协议之Content-Encoding - 天下无贼 - 51CTO技术博客
  14. [环境]搭建Node+NPM+Grunt+Ruby开发环境
  15. HTML表格实现固定表头 内容滚动
  16. Win10语言包下载
  17. 阿里云分布式架构云平台解决方案
  18. The field file exceeds its maximum permitted size of 1048576 bytes.
  19. Windows 下使用PDH 获取CPU 使用率
  20. 打听同事工资,我被离职了

热门文章

  1. 能生成html的 商城系统,生成HTML静态对网上商城系统的影响
  2. 网址收藏--日语学习
  3. TeXstudio参考文献引用及编译总结
  4. 阿里巴巴“数据库侠客”:此行路远,不问归期
  5. racte margin 居中 失效_轧机轴承外套断裂失效分析
  6. react里面的接口调用方法
  7. Thunderbird Mail雷鸟账号或密码错误无法登陆/只能收件无法寄件解决
  8. 记录微信小程序的第一天
  9. 大数据毕设 Python消费数据分析与可视化
  10. UI自动化-playwright-浏览器语言设置为中文