Android Touch 事件总结

---恢复内容开始---

1.Touch事件传递机制

  过程有点儿类似于栈, ViewGroup的子类有都继承它的以下3个方法:

  public boolean dispatchTouchEvent(MotionEvent event);  //消息分发, 相当于在一个函数中调用其他函数

  public boolean onInterceptTouchEvent(MotionEvent event); // 拦截消息

  public boolean onTouchEvent(MotionEvent event);    // 触屏处理, 如果完成处理则返回true, 相当于break直接退出消息处理,如果没有完成处理则返回false, 返回到分发消息给它的View控件的onTouchEvent()继续进行递归处理.制定返回到消息来源处

  消息往下分发称为隧道方式, 触屏消息在子视图中没有处理完传递给上层控件,称为冒泡方式.

2.区别onTouch() 和 onTouchEvent()

  onTouch(): 定义在接口OnTouchListener中, 绑定触屏监听器后覆写这个方法实现自定义触屏行为

  onTouchEvent(): Activity 中的方法, 当屏幕有触摸事件时调用这个方法, 如果一直按着屏幕,就会一直循环调用,我的电脑上大概几十毫秒调用一次,不过这个不用管. 当然, onTouch()方法也会在你一直按着绑定的控件的时候一直循环调用.

3.onTouchEvent()处理的消息

  onTouchEvent()方法是从Activity中继承下来的, 所以只需要在Activity中覆写就可以了, 它处理以下3种消息

  1) 屏幕按下: MotionEvent.ACTION_DOWN

  2) 从屏幕上释放: MotionEvent.ACTION_UP

  3) 在屏幕上移动: MotionEvent.ACTION_MOVE

 1 @Override
 2 public boolean onTouchEvent(MotionEvent event) {
 3     int[] events = {
 4             MotionEvent.ACTION_DOWN,
 5             MotionEvent.ACTION_MOVE,
 6             MotionEvent.ACTION_UP,
 7             MotionEvent.ACTION_CANCEL,
 8             MotionEvent.ACTION_OUTSIDE,
 9             MotionEvent.ACTION_POINTER_DOWN,
10             MotionEvent.ACTION_POINTER_UP,
11             MotionEvent.EDGE_TOP,
12             MotionEvent.EDGE_BOTTOM,
13             MotionEvent.EDGE_LEFT,
14             MotionEvent.EDGE_RIGHT
15     };
16     String[] szEvent = {
17             "MotionEvent.ACTION_DOWN",
18             "MotionEvent.ACTION_MOVE",
19             "MotionEvent.ACTION_UP",
20             "MotionEvent.ACTION_CANCEL",
21             "MotionEvent.ACTION_OUTSIDE",
22             "MotionEvent.ACTION_POINTER_DOWN",
23             "MotionEvent.ACTION_POINTER_UP",
24             "MotionEvent.EDGE_TOP",
25             "MotionEvent.EDGE_BOTTOM",
26             "MotionEvent.EDGE_LEFT",
27             "MotionEvent.EDGE_RIGHT"
28     };
29     for(int i=0;i<events.length;++i){
30         if(events[i] == event.getAction()){
31             Log.v(TAG,szEvent[i]);
32             break;
33         }
34     }
35     return super.onTouchEvent(event);
36 }

  将上面的方法覆盖Activity的方法即可, 值得注意的是,MOVE事件会在你点击释放过程中触发, 而且触发多次! 所以在手势识别过程部分函数参数会只记录最后一个MOVE事件

4.手势识别: android.view.GestureDetector类 + OnGestureListener接口

  里面有很多方法,覆写之后可以实现多种触屏效果, 增加用户体验

  使用GestureDetector对象,为这个对象添加一个监听器,并覆写方法. 这个对象可以作为Activity的属性, 当然也就是最这个Activity进行手势解析了.然后再覆写Activity的onTouchEvent方法, 对触屏事件进行监听即可.

 1 private GestureDetector gestureDetector = new GestureDetector(new GestureDetector.OnGestureListener() {
 2     @Override
 3     public boolean onDown(MotionEvent e) {
 4         // 按下屏幕的时候
 5         Toast.makeText(MainActivity.this,"onDown",Toast.LENGTH_SHORT).show();
 6         Log.v(TAG,"onDown");
 7         return false;
 8     }
 9
10     @Override
11     /**
12      * 点击了屏幕, 但是没有移动和弹起动作. 与onDown的区别:
13      *      onDown():一旦按下屏幕,就尝试onDown事件
14      *      onShowPress(): onDown事件产生后,一段时间内没有移动和弹起(先产生了onDown事件)
15      *
16      */
17     public void onShowPress(MotionEvent e) {
18         Log.v(TAG,"onShowPress");
19         Toast.makeText(MainActivity.this,"onShowPress",Toast.LENGTH_SHORT).show();
20     }
21
22     @Override
23     /**
24      * 轻击触摸屏和弹起,这个过程中如果产生了onLongPress,onScroll 和 onFling事件,就不会产生onSingleTabUp事件
25      */
26     public boolean onSingleTapUp(MotionEvent e) {
27         Log.v(TAG,"onSingleTabUp");
28         Toast.makeText(MainActivity.this, "onSingleTagUp", Toast.LENGTH_SHORT).show();
29         return false;
30     }
31
32     @Override
33     /**
34      * 滚动事件, 当在屏幕上迅速移动,会产生onScroll,由ACTION_MOVE产生
35      * @param: distanceX: 距离上次产生onScroll事件后, X轴的移动距离
36      */
37     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
38         Log.v(TAG,"onScroll");
39         Toast.makeText(MainActivity.this, "onScroll", Toast.LENGTH_SHORT).show();
40         return false;
41     }
42
43     @Override
44     public void onLongPress(MotionEvent e) {
45         Log.v(TAG,"onLongPress");
46         Toast.makeText(MainActivity.this, "onLongPress", Toast.LENGTH_SHORT).show();
47     }
48
49     @Override
50     /**
51      * @param: e1: 第一个ACTION_DOWN MotionEvent
52      * @param: e2: 最后一个ACTION_MOVE MotionEvent
53      * @param: velocityX: X轴上的移动速度  px/s
54      * @param: velocityY: Y轴上的移动速度
55      */
56     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
57         Log.v(TAG,"onFling");
58         Toast.makeText(MainActivity.this, "onFling", Toast.LENGTH_SHORT).show();
59
60         return false;
61     }
62 });
63
64 @Override
65 public boolean onTouchEvent(MotionEvent event) {
66     Log.v(TAG,"onTouchEvent");
67     if(gestureDetector.onTouchEvent(event)){
68         return true;
69     }else{
70       return super.onTouchEvent(event); //未完成处理交给上层控件
71     }72 }

5.处理键盘事件

  覆写Activity的onKeyDown()即可,有的需要在AndroidManifest.xml文件中添加权限...

 1 public boolean onKeyUp(int keyCode, KeyEvent event) {
 2     switch (keyCode){
 3         case KeyEvent.KEYCODE_HOME: //好像说不再支持了,需要修改框架源码实现,有点儿复杂,期待新发现
 4             Log.v(TAG,"HOME up");
 5             break;
 6         case KeyEvent.KEYCODE_BACK:
 7             Log.v(TAG,"BACK up");
 8             break;
 9         case KeyEvent.KEYCODE_DPAD_LEFT:
10             Log.v(TAG,"Left up");
11             break;
12     }
13 //        return  true;
14     return super.onKeyUp(keyCode, event);
15 }
时间: 2024-09-29 05:28:47

Android Touch 事件总结的相关文章

Android touch 事件传递机制

前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事件进行拦截.这个时候我们就需要明白android touch 事件传递机制, (2)以前很多时候比较模糊,也许是网上看到也有很多事件传递的相关文章,但我看着头晕,解释不彻底,有的说得一半,总算不满足不满意,于是据我自己的理解来彻底的来整理下具体的是怎么个传递方式,分享给大家,希望大家看到有什么不对的

【转】Android Touch事件传递机制解析

原文地址:http://www.cnblogs.com/runssnail/p/4250549.html 说明:本文在原文地址上有所改动 一.小故事 在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给了自己组员(程序员) 程序员:分派给了自己带的实习生. 实习生:好苦逼,无法分派,怎么办啊?只能自己干了 但是实习生能不能做好,有两种情况了. 情况一:

Android Touch事件传递机制详解 上

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 最近总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,以前也花时间学习过Android Touch事件的传递机制,可以每次用起来的时候总是忘记了,索性自己总结一下写篇文章避免以后忘记了,其实网上关于Touch事件的传递的文章真的很多,但是很少有系统性的,都是写了一个简单的demo运行了一下,对于我们了解Android Touch事件基本上没有任何帮助. 今

android Touch事件传递小结

这次还是先贴上测试代码吧.. 主布局文件是个三层结构,最外层和中间层都是LinearLayout的子类,里层是个TextView: <com.example.touchevent.OutterLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/o

Android Touch事件传递机制引发的血案

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38942135 关于Android Touch事件传递机制我之前也写过两篇文章,自觉得对Touche事件还是理解得比較清楚的,可是近期遇到的一个问题,让我再次对Android Touche事件进行一次学习. 我的关于Android Touche事件传递机制的文章例如以下: http://blog.csdn.net/yuanzeyao/article/details/37961997 http

Android Touch事件分发过程

虽然网络上已经有非常多关于这个话题的优秀文章了,但还是写了这篇文章,主要还是为了加强自己的记忆吧,自己过一遍总比看别人的分析要深刻得多.那就走起吧. 简单演示样例 先看一个演示样例 : 布局文件 : <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id=&q

Android touch事件的派发流程

http://blog.csdn.net/xyz_lmn/article/details/12517911 通过流程图了解touch事件派发过程. http://blog.csdn.net/stonecao/article/details/6759189 从代码的层面分析,尽管目前代码已经变化了,但是作者的分析对Android touch事件派发流程的理解还是很有帮助的. http://www.2cto.com/kf/201504/388625.html 通过实例了解Button的touch事件

Android Touch事件传递机制 二:单纯的(伪生命周期)

转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在我想使用一个demo以及一个实例来学习一下Andorid中的Touch事件处理过程. 在Android系统中,和Touch事件分发和处理紧密相关的三个函数如下:(1) public boolean dispatchTouchEvent(MotionEvent ev)(2) public boolea

Android Touch事件原理加实例分析

Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. Android Touch事件原理描述 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP. 当屏幕中包含一个ViewGr

Android Touch事件传递机制详解 下

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yuanzeyao2008/7660997 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在我想使用一个demo以及一个实例来学习一下Andorid中的Touch事件处理过程. 在Android系统中,和Touch事件分发和处理紧密相关的三个函数如下:(1) public