求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
Android Touch事件传递机制解析
 

发布于2012-5-25

 

开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把android touch机制好好看了一下,呵呵。。

android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法:

1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent

2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent

3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent

注意:不是所有的View的子类,很多教程都说的是所有的View的子类,只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view了,所以不用再向它的子视图分发了,它也没有子视图了,所以它没有dispatch和Intercept,只有touchEvent。

说明: 白色为最外层,它占满整个屏幕;

红色为中间区域,属于白色中的一层;

黑色为中心区域,必于红色中的一层。

注意:他们本质上是:LinearLayout,而不是RelativeLayout或者其它布局。

1.由中心区域处理touch事件

布局文件如下:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 
    <com.kris.touch.widget.TouchView 
        android:id="@+id/view_out" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:background="#fff" 
        android:gravity="center"> 
            <com.kris.touch.widget.TouchView 
                android:id="@+id/view_mid" 
                android:layout_width="300px" 
                android:layout_height="400px" 
                android:background="#f00" 
                android:gravity="center"> 
            <com.kris.touch.widget.TouchView 
                android:id="@+id/view_center" 
                android:layout_width="150px" 
                android:layout_height="150px" 
                android:background="#000" 
                android:gravity="center" 
                android:clickable="true"> 
            </com.kris.touch.widget.TouchView> 
            </com.kris.touch.widget.TouchView> 
    </com.kris.touch.widget.TouchView> 
</LinearLayout> 

注意: android:clickable="true"

接下来我们看一下打印的日志:

结合是上面的日志,我们可以看一下ACTION_DOWN事件处理流程:

说明:

首先触摸事件发生时(ACTION_DOWN),由系统调用Activity的dispatchTouchEvent方法,分发该事件。根据触摸事件的坐标,将此事件传递给out的dispatchTouchEvent处理,out则调用onInterceptTouchEvent 判断事件是由自己处理,还是继续分发给子View。此处由于out不处理Touch事件,故根据事件发生坐标,将事件传递给out的直接子View(即middle)。

Middle及Center中事件处理过程同上。但是由于Center组件是clickable 表示其能处理Touch事件,故center中的onInterceptTouchEvent方法将事件传递给center自己的onTouchEvent方法处理。至此,此Touch事件已被处理,不继续进行传递。

2.没有指定谁会处理touch事件

布局文件如下:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 
    <com.kris.touch.widget.TouchView 
        android:id="@+id/view_out" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:background="#fff" 
        android:gravity="center"> 
            <com.kris.touch.widget.TouchView 
                android:id="@+id/view_mid" 
                android:layout_width="300px" 
                android:layout_height="400px" 
                android:background="#f00" 
                android:gravity="center"> 
            <com.kris.touch.widget.TouchView 
                android:id="@+id/view_center" 
                android:layout_width="150px" 
                android:layout_height="150px" 
                android:background="#000" 
                android:gravity="center"> 
            </com.kris.touch.widget.TouchView> 
            </com.kris.touch.widget.TouchView> 
    </com.kris.touch.widget.TouchView> 
</LinearLayout> 

注意:只是比上一次的布局少了android:clickable="true"


相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程

 
分享到
 
 
     


android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...