View的事件分发机制——简单明了

来源:互联网 发布:用eclipse编写python 编辑:程序博客网 时间:2024/06/01 08:23

最近在我们的小规模Android技术群有个人问了一个问题,关于事件分发的问题。“父控件(ViewGroup)需要实现左右滑动,而父控件中的子View又要实现OnClick方法”。他的问题就是子View实现了OnClick方法而父控件的OnTouch不响应。

问题就是这样,其实搞定这个问题很简单。不过得弄清楚View的事件分发。话说普通Android程序员源码瞅瞅就成了,不用死气摆列的弄懂。话不多说先上一段小代码。

//开始分发咯public boolean dispatchTouchEvent(MotionEvent event){     boolean result=false;     if(onInterceptTouchEvent(event))//问问自己要不要     {        resulet=onTouchEvent(event);//自己的触摸事件     }     else     {        resulet=child.dispatchTouchEvent(event);//调用子View的事件分发     }     return result;}

得了,就上面的算是伪代码吧,感觉应对普通的ViewGroup事件冲突算是bingo咯。得解释下下,顺便理理自己的思路。

View的事件分发,主要得分清楚是View还是ViewGroup。其中涉及到ViewGroup事件分发的方法是dispatchTouchEvent->onInterceptTouchEvent->onTouchEvent。调用的顺序我也标注出来了。而单纯的View事件分发中没有onInterceptTouchEvent。

好啦,具体是怎么分发的看我的伪代码就成,其中方法中的实现细节(你丫自己重写个试试不就得了?)。国际惯例回答最初上面的那个问题。
QU:子View实现了OnClick方法而父控件的OnTouch不响应
AN:在父viewgroup中intercept方法中判断是否向左或向右方法。如果是则return true(调用自己的ontouch)。如果不是则返回false将触摸事件给自己的childview消费。(现在的问题是不是跑到判断是否向左右滑动啦?哈哈)
PS:正常情况下一次点击事件只能被一个View给消费了,如果子View返回了true,父控件就不会响应了。也有特殊情况,比如在ontoutch方法中将Event强制给了别的View。那就有两个View会响应本次的“抚摸”了~

0 0
原创粉丝点击