zoukankan      html  css  js  c++  java
  • 【Android每周专题】触摸屏事件

    本系列文章均为A2BGeek原创,转载务必在明显处注明:
    转载自A2BGeek的【Android每周专题】系列,原文链接:http://blog.csdn.net/benbmw2008/article/details/11143893


    每个专题的实验代码会在文章的最后放上下载链接!下面开始第一个专题——触摸屏事件。

    Android系统的用户事件有触屏事件和按键事件,今天的重点放在触屏事件上,先来看一下实验代码的结构:


    布局如下:

    <com.example.gesturedemo.MyRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <com.example.gesturedemo.MyTextView
            android:id="@+id/tv"
            android:layout_width="200dip"
            android:layout_height="200dip"
            android:layout_centerInParent="true"
            android:background="#33B5E5"
            android:gravity="center"
            android:text="@string/hello_world" />
    
    </com.example.gesturedemo.MyRelativeLayout>


    样子大概就是这样的:

    其中布局文件中的MyRelativeLayout和MyTextView也没有什么特别的,只是实现了和事件分发有关的几个回调方法——dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。在MainActivity中也实现了dispatchTouchEvent和onTouchEvent。好了,该说明的都说明了,下面实验开始,如果对代码还是不清楚的话可以先下载代码再结合代码来看文章。

    实验1——点击一下蓝色区域:

    得到日志如下:

    09-05 15:42:25.054: V/gesturedemo(25782): MainActivity--->dispatchTouchEvent
    09-05 15:42:25.054: V/gesturedemo(25782): MyRelativeLayout--->dispatchTouchEvent
    09-05 15:42:25.054: V/gesturedemo(25782): MyRelativeLayout--->onInterceptTouchEvent
    09-05 15:42:25.054: V/gesturedemo(25782): MyTextView--->dispatchTouchEvent
    09-05 15:42:25.054: V/gesturedemo(25782): MyTextView--->onTouchEvent
    09-05 15:42:25.054: V/gesturedemo(25782): MyRelativeLayout--->onTouchEvent
    09-05 15:42:25.054: V/gesturedemo(25782): MainActivity--->onTouchEvent
    09-05 15:42:25.085: V/gesturedemo(25782): MainActivity--->dispatchTouchEvent
    09-05 15:42:25.085: V/gesturedemo(25782): MainActivity--->onTouchEvent

    实验2——点击一下蓝色区域周围的白色区域:

    得到日志如下:

    09-05 15:43:37.875: V/gesturedemo(25782): MainActivity--->dispatchTouchEvent
    09-05 15:43:37.875: V/gesturedemo(25782): MyRelativeLayout--->dispatchTouchEvent
    09-05 15:43:37.875: V/gesturedemo(25782): MyRelativeLayout--->onInterceptTouchEvent
    09-05 15:43:37.875: V/gesturedemo(25782): MyRelativeLayout--->onTouchEvent
    09-05 15:43:37.875: V/gesturedemo(25782): MainActivity--->onTouchEvent
    09-05 15:43:37.945: V/gesturedemo(25782): MainActivity--->dispatchTouchEvent
    09-05 15:43:37.945: V/gesturedemo(25782): MainActivity--->onTouchEvent

    做了两个实验之后我们观察现象,总结规律:

    当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,也就是MyRelativeLayout,TouchEvent最先到达最顶层view的dispatchTouchEvent ,然后由dispatchTouchEvent方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回false ,则交给这个view的 interceptTouchEvent方法来决定是否要拦截这个事件,如果interceptTouchEvent返回 true ,也就是拦截掉了,则交给它的onTouchEvent来处理,如果interceptTouchEvent返回false ,那么就传递给子view ,由子view的dispatchTouchEvent再来开始这个事件的分发。如果事件传递到某一层的子view的onTouchEvent上了,这个方法返回了false ,那么这个事件会从这个view往上传递,都是onTouchEvent 来接收。而如果传递到最上面的onTouchEvent也返回false的话,这个事件就会“消失”,也就是由activity的onTouchEvent来处理了。

    规律对于第一次接触触屏事件的人来说有的复杂,我画张图来说明一下:


    默认情况下每个和触屏事件相关的回调方法都返回false,导致如下的事件流向,这个也是符合前面总结的规律的。在down事件沿着默认事件流向走到activity的onTouchEvent方法后,如果你在触屏上做的是一个fling操作,那么后序的move和up操作是不会沿着这个默认路径的,而是直接到达activity的onTouchEvent。从日志就能看出来:

    09-05 16:16:36.867: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
    09-05 16:16:36.871: V/gesturedemo(27973): MyRelativeLayout--->dispatchTouchEvent
    09-05 16:16:36.875: V/gesturedemo(27973): MyRelativeLayout--->onInterceptTouchEvent
    09-05 16:16:36.878: V/gesturedemo(27973): MyTextView--->dispatchTouchEvent
    09-05 16:16:36.890: V/gesturedemo(27973): MyTextView--->onTouchEvent
    09-05 16:16:36.890: V/gesturedemo(27973): MyTextView--->onTouchEvent--->DOWN
    09-05 16:16:36.894: V/gesturedemo(27973): MyRelativeLayout--->onTouchEvent
    09-05 16:16:36.898: V/gesturedemo(27973): MainActivity--->onTouchEvent
    09-05 16:16:36.902: V/gesturedemo(27973): MainActivity--->onTouchEvent--->DOWN
    09-05 16:16:37.007: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
    09-05 16:16:37.007: V/gesturedemo(27973): MainActivity--->onTouchEvent
    09-05 16:16:37.011: V/gesturedemo(27973): MainActivity--->onTouchEvent--->MOVE
    09-05 16:16:37.027: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
    09-05 16:16:37.027: V/gesturedemo(27973): MainActivity--->onTouchEvent
    09-05 16:16:37.027: V/gesturedemo(27973): MainActivity--->onTouchEvent--->MOVE
    09-05 16:16:37.043: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
    09-05 16:16:37.043: V/gesturedemo(27973): MainActivity--->onTouchEvent
    09-05 16:16:37.046: V/gesturedemo(27973): MainActivity--->onTouchEvent--->MOVE
    09-05 16:16:37.066: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
    09-05 16:16:37.066: V/gesturedemo(27973): MainActivity--->onTouchEvent
    09-05 16:16:37.070: V/gesturedemo(27973): MainActivity--->onTouchEvent--->UP


    这种是MyTextView的onTouchEvent返回true的情况,如果你做了一个fling操作,down、move、up事件都会沿着这条路径到达MyTextView

    看一下日志会更加清楚:

    09-05 16:28:09.691: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
    09-05 16:28:09.695: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
    09-05 16:28:09.699: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
    09-05 16:28:09.699: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
    09-05 16:28:09.703: V/gesturedemo(28611): MyTextView--->onTouchEvent
    09-05 16:28:09.703: V/gesturedemo(28611): MyTextView--->onTouchEvent--->DOWN
    09-05 16:28:09.750: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
    09-05 16:28:09.750: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
    09-05 16:28:09.750: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
    09-05 16:28:09.753: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
    09-05 16:28:09.753: V/gesturedemo(28611): MyTextView--->onTouchEvent
    09-05 16:28:09.757: V/gesturedemo(28611): MyTextView--->onTouchEvent--->MOVE
    09-05 16:28:09.765: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
    09-05 16:28:09.769: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
    09-05 16:28:09.769: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
    09-05 16:28:09.769: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
    09-05 16:28:09.769: V/gesturedemo(28611): MyTextView--->onTouchEvent
    09-05 16:28:09.769: V/gesturedemo(28611): MyTextView--->onTouchEvent--->MOVE
    09-05 16:28:09.785: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
    09-05 16:28:09.785: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
    09-05 16:28:09.785: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
    09-05 16:28:09.785: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
    09-05 16:28:09.785: V/gesturedemo(28611): MyTextView--->onTouchEvent
    09-05 16:28:09.785: V/gesturedemo(28611): MyTextView--->onTouchEvent--->MOVE
    09-05 16:28:09.808: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
    09-05 16:28:09.808: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
    09-05 16:28:09.808: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
    09-05 16:28:09.812: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
    09-05 16:28:09.812: V/gesturedemo(28611): MyTextView--->onTouchEvent
    09-05 16:28:09.812: V/gesturedemo(28611): MyTextView--->onTouchEvent--->UP

    好了,关于触摸屏事件我觉得讲到这里已经没什么可以讲了,大家结合实验代码自己练习一下就可以了,规律掌握之后剩下的就需要机智的读者自己灵活运用了。

    顺便预告一下,本周会更新两篇博客,下一篇是有关手势方面的。

    实验代码点击下载

    参考文献:

    http://blog.csdn.net/stonecao/article/details/6759189

  • 相关阅读:
    Web前端工程师技能列表
    CSS框架的相关汇总(CSS Frameworks)
    一个有趣的发现
    (转丁学)Firefox2的一个bug和脑子进了水的IE
    深入语义:列表Tag(ul/ol)和表格Tag(table)的抉择
    css命名简单框架
    腾讯的三栏布局考题
    土豆网前端概况
    伪绝对定位(译)
    右下角浮动广告代码DEMO
  • 原文地址:https://www.cnblogs.com/riskyer/p/3303843.html
Copyright © 2011-2022 走看看