TouchEvent 测试Demo总结

由于一直是看别人的资料不是特别清晰 所以这次自己试验


主布局很简单 两个简单的自定义View 里面都复写三个方法 为的是方便打log查看调用顺序

dispatchTouchEvent

onInterceptTouchEvent

onTouchEvent


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <com.example.toucheventdemo.MyLinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        
        <com.example.toucheventdemo.view 
            android:layout_width="100dip"
            android:layout_height="100dip"
            android:background="@android:color/black"
            ></com.example.toucheventdemo.view>
        </com.example.toucheventdemo.MyLinearLayout>

</RelativeLayout>


1:正常的按下 并 滑动了

输出log为

03-18 23:26:56.422: E/wow(7372): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:26:56.422: E/wow(7372): MyLinearLayout------->onInterceptTouchEvent  down
03-18 23:26:56.422: E/wow(7372): ViewPager--->dispatchTouchEvent_down
03-18 23:26:56.422: E/wow(7372): ViewPager--->onInterceptTouchEvent  down
03-18 23:26:56.422: E/wow(7372): ViewPager--->onTouchEvent  down
03-18 23:26:56.422: E/wow(7372): MyLinearLayout------->onTouchEvent  down


没有任何move和up动作 因为没有任何一个view的onTouchEvent返回true 表示所有view都不消费点击事件


①:更改父view的dispatch   (默认情况下那三个方法全是返回的super的)

1:true

所有的事件都被拦截在了父view的 dispatchTouchEvent了 后面的所有方法包括子类的一概不响应了

但是此时可以响应 down   move  up

2:false

所有事件都被父view的 dispatch拦截了 但是此时只能响应 down

3:super

03-18 23:59:23.240: E/wow(16370): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:59:23.240: E/wow(16370): MyLinearLayout------->onInterceptTouchEvent  down
03-18 23:59:23.240: E/wow(16370): ViewPager--->dispatchTouchEvent_down
03-18 23:59:23.240: E/wow(16370): ViewPager--->onInterceptTouchEvent  down
03-18 23:59:23.240: E/wow(16370): ViewPager--->onTouchEvent  down
03-18 23:59:23.240: E/wow(16370): MyLinearLayout------->onTouchEvent  down

②更改父view的 onInterceptTouchEvent  将dispatch恢复成return super

1:true 

按下去并且移动

03-18 23:34:54.072: E/wow(9690): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:34:54.082: E/wow(9690): MyLinearLayout------->onInterceptTouchEvent  down
03-18 23:34:54.082: E/wow(9690): MyLinearLayout------->onTouchEvent  down

父view的三个方法都响应了 最终被onTouchEvent响应

因为该view拦截了事件 所以所有响应要交给该view的onTouchEvent 而要都intercept必须是从disptch开始调用它的 所以三个方法都响应了

2:false
03-18 23:37:57.097: E/wow(11082): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:37:57.097: E/wow(11082): MyLinearLayout------->onInterceptTouchEvent  down
03-18 23:37:57.097: E/wow(11082): ViewPager--->dispatchTouchEvent_down
03-18 23:37:57.097: E/wow(11082): ViewPager--->onInterceptTouchEvent  down
03-18 23:37:57.097: E/wow(11082): ViewPager--->onTouchEvent  down
03-18 23:37:57.107: E/wow(11082): MyLinearLayout------->onTouchEvent  down

说明不拦截 一切正常

3:改成return  super。

和2的log是一样的  这也说明了系统对ViewGroup默认返回false不拦截

③对父的 onTouchEvent

1:返回true

03-18 23:40:56.679: E/wow(12168): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:40:56.689: E/wow(12168): MyLinearLayout------->onInterceptTouchEvent  down
03-18 23:40:56.689: E/wow(12168): ViewPager--->dispatchTouchEvent_down
03-18 23:40:56.689: E/wow(12168): ViewPager--->onInterceptTouchEvent  down
03-18 23:40:56.689: E/wow(12168): ViewPager--->onTouchEvent  down
03-18 23:40:56.689: E/wow(12168): MyLinearLayout------->onTouchEvent  down
03-18 23:40:56.709: E/wow(12168): MyLinearLayout------->dispatchTouchEvent_move
03-18 23:40:56.709: E/wow(12168): MyLinearLayout------->onTouchEvent  move
03-18 23:40:56.719: E/wow(12168): MyLinearLayout------->dispatchTouchEvent_up
03-18 23:40:56.729: E/wow(12168): MyLinearLayout------->onTouchEvent  up

正常逻辑

因为分发机制是要先dispatch从tree树自上往下的 当最终确认了消费体的时候才会将以后的事件直接给该view

2:返回false

03-18 23:43:47.361: E/wow(12674): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:43:47.361: E/wow(12674): MyLinearLayout------->onInterceptTouchEvent  down
03-18 23:43:47.361: E/wow(12674): ViewPager--->dispatchTouchEvent_down
03-18 23:43:47.361: E/wow(12674): ViewPager--->onInterceptTouchEvent  down
03-18 23:43:47.361: E/wow(12674): ViewPager--->onTouchEvent  down
03-18 23:43:47.371: E/wow(12674): MyLinearLayout------->onTouchEvent  down

因为没有最终确定消费体 所以无任何view可以接受move 和 up 因此所有view只能响应down

3:返回super

同2

--------------------------------------------------------------------------------------------------------------------------------------------


现在将父view都还原成super 下面来更改子view


①子view的dispatch

1:返回true:

类似于父view返回true时候一样 但是此时的log反应可以在父类的结果上更进一步

当dispatch返回true的时候,当前view的其他任何touch方法都不会被调用 但是其dispatch会一直接受到其父view传来的各种消息 down move up (其父view要传递消息过来必定是父view的两个方法都要过一遍的:注意,不是三个)


03-18 23:47:27.566: E/wow(13663): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:47:27.566: E/wow(13663): MyLinearLayout------->onInterceptTouchEvent  down
03-18 23:47:27.566: E/wow(13663): ViewPager--->dispatchTouchEvent_down
03-18 23:47:27.596: E/wow(13663): MyLinearLayout------->dispatchTouchEvent_move
03-18 23:47:27.596: E/wow(13663): MyLinearLayout------->onInterceptTouchEvent  move
03-18 23:47:27.596: E/wow(13663): ViewPager--->dispatchTouchEvent_move
03-18 23:47:27.606: E/wow(13663): MyLinearLayout------->dispatchTouchEvent_up
03-18 23:47:27.606: E/wow(13663): MyLinearLayout------->onInterceptTouchEvent  up
03-18 23:47:27.606: E/wow(13663): ViewPager--->dispatchTouchEvent_up

要注意:这里并没有onTouchEvent 因为这里根本没有冒泡的过程了

2:返回false:

说明不消费,但是因为没有任何一个目标消费view 所以 move up事件是没法触发的,因为这两个时间必须要先有一个view消费了down。

按下并滑动 虽然没有调用子view的onTouchEvent但是却可以冒泡

03-18 23:53:21.404: E/wow(14460): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:53:21.404: E/wow(14460): MyLinearLayout------->onInterceptTouchEvent  down
03-18 23:53:21.404: E/wow(14460): ViewPager--->dispatchTouchEvent_down
03-18 23:53:21.404: E/wow(14460): MyLinearLayout------->onTouchEvent  down

在此基础上对父view的dispatch返回false时候的效果做扩展结论:

当dispatch返回false的时候 最多响应到这个view的dispatch 且不会响应down 和 up了

3:返回super

按下并滑动

03-18 23:54:21.067: E/wow(15318): MyLinearLayout------->dispatchTouchEvent_down
03-18 23:54:21.067: E/wow(15318): MyLinearLayout------->onInterceptTouchEvent  down
03-18 23:54:21.067: E/wow(15318): ViewPager--->dispatchTouchEvent_down
03-18 23:54:21.067: E/wow(15318): ViewPager--->onInterceptTouchEvent  down
03-18 23:54:21.067: E/wow(15318): ViewPager--->onTouchEvent  down
03-18 23:54:21.067: E/wow(15318): MyLinearLayout------->onTouchEvent  down

比上面多响应了intercept和onTouch

②子view的onInterceptEvent

1:true

按下并滑动

同父类此时的情况 三个方法都响应了

③子view的onTouch

1:true

所有事件都从父view分发到子view 但是不会冒泡回去了  父类view一路过来的话其三个方法都会调用都

子view只会在第一次down分发的时候调用interceptTouchEvent后面就不会再调用了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值