onInterceptTouchEvent()和onTouchEvent()调用关系
博客专区 > Nikita90 的博客 > 博客详情
onInterceptTouchEvent()和onTouchEvent()调用关系
Nikita90 发表于4年前
onInterceptTouchEvent()和onTouchEvent()调用关系
  • 发表于 4年前
  • 阅读 628
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个childView触发onTouchEvent()之前对相关事件进行一次拦截。ViewGroup会包含若干childView,onInterceptTouchEvent能够统一监控各种touch事件。不能包含子控件的空间没有这个方法,如TextView,而LinearLayout就有。

在ViewGroup里覆写了onInterceptTouchEvent()方法,就可以对各种touch事件加以拦截。但是touch事件在onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全取决于onInterceptTouchEvent()和onTouchEvent()的返回值。

  1. down事件首先会传递到onInterceptTouchEvent()方法。该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后:

    (1)return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。

    (2)return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。 

  2. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。 

  3. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。


实验:

<?xml version="1.0" encoding="utf-8"?> 
<com.test.LayoutView1 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <com.test.LayoutView2
        android:orientation="vertical"         
        android:layout_width="fill_parent"         
        android:layout_height="fill_parent"         
        android:gravity="center">        
        <com.test.MyTextView  
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"  
            android:text="AB"/>    
    </com.touchstudy.LayoutView2> 
</com.touchstudy.LayoutView1>
  1. onInterceptTouchEvent()处理down事件均返回false,onTouchEvent处理事件均返回true:

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_DOWN

    LayoutView2 : onInterceptTouchEvent  action :  ACTION_DOWN

    MyTextView : onTouchEvent  action :  ACTION_DOWN

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_MOVE

    LayoutView2 : onInterceptTouchEvent  action :  ACTION_MOVE

    MyTextView onTouchEvent  action :  ACTION_MOVE

    这是最常见的情况,onInterceptTouchEvent并没有做任何改变事件传递时序的操作,效果上和没有重写该方法一样。各种事件的传递本身是自底向上的,次序:LayoutView1 -> LayoutView2 -> MyTextView. 在onInterceptTouchEvent均返回false时,LayoutView1 和 LayoutView2 的onTouchEvent并不会接收到事件,而是最终传递给了MyTextView.

  2. LayoutView1 的onInterceptTouchEvent处理down事件返回true,MyTextView的onTouchEvent事件返回true:

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_DOWN

    LayoutView1 : onTouchEvent  action :  ACTION_DOWN

    LayoutView1 : onTouchEvent  action :  ACTION_MOVE

    LayoutView1 : onTouchEvent  action :  ACTION_MOVE

    LayoutView1  : onTouchEvent  action :  ACTION_UP

    LayoutView1在拦截第一次down事件时return true,所以后续事件(包括第一次的down)将由LayoutView1本身处理,事件不再传递下去。

  3. LayoutView1,LayoutView2的onInterceptTouchEvent处理down事件返回false,MyTextView的onTouchEvent事件返回false,LayoutView2的onTouchEvent事件返回true

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_DOWN

    LayoutView2 : onInterceptTouchEvent  action :  ACTION_DOWN

    MyTextView : onTouchEvent  action :  ACTION_DOWN

    LayoutView2 : onTouchEvent  action :  ACTION_DOWN

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_MOVE

    LayoutView2 : onTouchEvent  action :  ACTION_MOVE

    LayoutView1 : onInterceptTouchEvent  action :  ACTION_MOVE

    LayoutView2 : onTouchEvent  action :  ACTION_MOVE


共有 人打赏支持
粉丝 0
博文 4
码字总数 3427
×
Nikita90
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: