zoukankan      html  css  js  c++  java
  • MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序【转】

    本文源地址:http://www.cnblogs.com/rocky_yi/archive/2011/01/21/1941522.html# ,转载请注明出处!

    在看Android的触摸响应机制的时候,不是很了解触摸回调如何实现,看到这文章,转载一下,主要关注onInterceptTouchEvent和onTouchEvent两个系统回调。

    onInterceptTouchEvent()用于处理事件并改变事件的传递方向。处理事件这个不用说了,你在函数内部编写代码处理就可以了。而决定传递方向的是返回值,返回为false时事件会传递给子控件的onInterceptTouchEvent();返回值为true时事件会传递给当前控件的onTouchEvent(),而不在传递给子控件,这就是所谓的Intercept(截断)。

    onTouchEvent() 用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。可能你要问是否消费了又区别吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="utf-8"?>
    <com.touchstudy.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    <com.touchstudy.LayoutView2
    android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="center">
    <com.touchstudy.MyTextView
    android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/tv"
                android:text="AB"
                android:textSize="40sp"
                android:textStyle="bold"
                android:background="#FFFFFF"
                android:textColor="#0000FF"/>
    </com.touchstudy.LayoutView2>
    </com.touchstudy.LayoutView1>

    在没有重写onInterceptTouchEvent()和onTouchEvent()的情况下(他们的返回值都是false), 对上面这个布局,MotionEvent事件的传递顺序如下:

    当某个控件的onInterceptTouchEvent()返回值为true时,就会发生截断,事件被传到当前控件的onTouchEvent()。如我们将LayoutView2的onInterceptTouchEvent()返回值为true,则传递流程变成:

    如果我们同时将LayoutView2的onInterceptTouchEvent()和onTouchEvent()设置成true,那么LayoutView2将消费被传递的事件,同时后续事件(如跟着ACTION_DOWN的ACTION_MOVE或者ACTION_UP)会直接传给LayoutView2的onTouchEvent(),不传给其他任何控件的任何函数。同时传递给子空间一个ACTION_CANCEL事件。传递流程变成(图中没有画出ACTION_CANCEL事件):

     

  • 相关阅读:
    jQuery源码解析(架构与依赖模块)第二章 核心模块
    jQuery源码解析(架构与依赖模块)第一章 理解架构
    js中运算符的优先级
    JS将时间与时间戳互转
    关于JavaScript scope的一切
    java中继承以及其他相关内容
    java中数组的内容
    关于java中的引用数据类型
    关于java的源文件结构以及常用的包
    Java语言的基础内容
  • 原文地址:https://www.cnblogs.com/mythou/p/3132298.html
Copyright © 2011-2022 走看看