[Android应用]对GroupView中onInterceptTouchEvent方法的理解
2016-08-19 10:19
676 查看
onInterceptTouchEvent(MotionEvent ev)方法是GroupView控件中特有的一个方法,我们可以实现这个方法来截获所有的窗口点击事件来根据事件的不同来对子控件或自身分发事件触发。覆盖这个方法时需要小心注意,因为它和
分别重写Group1和Group2的onInterceptTouchEvent和onTouchEvent方法,重写MyTextView的onTouchEvent方法,最终得到的控件层次结构如下:
![](http://pic002.cnblogs.com/images/2012/117588/2012061718063193.png)
1.在默认返回值情况下logcat输出如下:
![](http://pic002.cnblogs.com/images/2012/117588/2012061718101828.jpg)
测试后可知默认情况下和所有方法返回值为false的结果一致,down事件的捕获顺序onInterceptTouchEvent先于onTouchEvent,由于onTouchEvent返回值为false,down事件没被消化,后续的move和up事件没有出现,同时逆序返回到父控件的onTouchEvent方法来捕获,如下图所示:
![](http://pic002.cnblogs.com/images/2012/117588/2012061719501687.png)
2.所有onTouchEvent返回值为true情况下logcat输出如下:
![](http://pic002.cnblogs.com/images/2012/117588/2012061719560084.jpg)
输出结果可以看出子控件MyTextView消化了down事件,后续的move和up事件正常捕获,由于down事件被消化,上层的onTouchEvent方法不执行,如下图所示:(三箭头分别指down、move、up事件)
![](http://pic002.cnblogs.com/images/2012/117588/2012061720463823.png)
既然如此,如果MyTextView中onTouchEvent方法返回为false,而group1和group2的onTouchEvent方法返回true的结果自然也就如下图的顺序了:
![](http://pic002.cnblogs.com/images/2012/117588/2012061721074013.png)
测试输出结果证明了这一猜测顺序,
![](http://pic002.cnblogs.com/images/2012/117588/2012061721084171.png)
[b]3.当某个GroupView中的onInterceptTouchEvent方法返回值为true情况下logcat输出如下(如group2):[/b]
![](http://pic002.cnblogs.com/images/2012/117588/2012061721121824.jpg)
如果在该方法返回值中返回true,那么子控件将获取不到任何点击事件,转而向自身的onTouchEvent方法转发,如下图所示:
![](http://pic002.cnblogs.com/images/2012/117588/2012061721162936.png)
如果onTouchEvent方法返回值都为true,那么根据规律结果就如下图顺序触发:
![](http://pic002.cnblogs.com/images/2012/117588/2012061721190279.png)
最后logcat的结果证实了这一猜测,
![](http://pic002.cnblogs.com/images/2012/117588/2012061721201442.jpg)
根据这一顺序规律我们便可复写GroupView中的onInterceptTouchEvent来控制事件的响应者。 测试程序下载 http://files.cnblogs.com/SCAU_que/EventDemo.rar
View.onTouchEvent(MotionEvent)有着复杂的关系,我们使用是需要和
View.onTouchEvent(MotionEvent)一同实现来达到正确的结果,事件触发顺序如下: 1.你首先会在该方法中得到一个down事件。 2.这个down事件会被得到处理,要么在这个GroupView中子控件的onTouchEvent()方法中,要么在GroupView自身的onTouchEvent()方法中。当我们在onTouchEvent()方法返回值中返回true的话,将会继续看到后续的触发事件(move、up等),要注意的是当我们在GroupView的onTouchEvent()事件返回值中返回true的话,该方法将不再捕获后续的(move up)事件。 3.如果在该方法返回值中返回false,down事件将根据控件树结构从根节点向目标子控件的onTouchEvent()方法分发。 4.如果在该方法返回值中返回true,那么你的子控件将获取不到任何点击事件。 为证明上面所说的顺序特点,下面通过测试代码来观察观察:
1publicclass MainActivity extends Activity { 2 Group1 group1; 3 Group2 group2; 4 MyTextView myTv; 5 6/** Called when the activity is first created. */ 7 @Override 8publicvoid onCreate(Bundle savedInstanceState) { 9super.onCreate(savedInstanceState);101112//--group113//----|14//-------group215//---------|16//------------myTv1718 group1 = new Group1(this);19 group2 = new Group2(this);20 myTv = new MyTextView(this);21 group2.addView(myTv, new LayoutParams(LayoutParams.FILL_PARENT,22 LayoutParams.FILL_PARENT));23 group1.addView(group2, new LayoutParams(LayoutParams.FILL_PARENT,24 LayoutParams.FILL_PARENT));25 setContentView(group1);26 }27 }
分别重写Group1和Group2的onInterceptTouchEvent和onTouchEvent方法,重写MyTextView的onTouchEvent方法,最终得到的控件层次结构如下:
![](http://pic002.cnblogs.com/images/2012/117588/2012061718063193.png)
1.在默认返回值情况下logcat输出如下:
![](http://pic002.cnblogs.com/images/2012/117588/2012061718101828.jpg)
测试后可知默认情况下和所有方法返回值为false的结果一致,down事件的捕获顺序onInterceptTouchEvent先于onTouchEvent,由于onTouchEvent返回值为false,down事件没被消化,后续的move和up事件没有出现,同时逆序返回到父控件的onTouchEvent方法来捕获,如下图所示:
![](http://pic002.cnblogs.com/images/2012/117588/2012061719501687.png)
2.所有onTouchEvent返回值为true情况下logcat输出如下:
![](http://pic002.cnblogs.com/images/2012/117588/2012061719560084.jpg)
输出结果可以看出子控件MyTextView消化了down事件,后续的move和up事件正常捕获,由于down事件被消化,上层的onTouchEvent方法不执行,如下图所示:(三箭头分别指down、move、up事件)
![](http://pic002.cnblogs.com/images/2012/117588/2012061720463823.png)
既然如此,如果MyTextView中onTouchEvent方法返回为false,而group1和group2的onTouchEvent方法返回true的结果自然也就如下图的顺序了:
![](http://pic002.cnblogs.com/images/2012/117588/2012061721074013.png)
测试输出结果证明了这一猜测顺序,
![](http://pic002.cnblogs.com/images/2012/117588/2012061721084171.png)
[b]3.当某个GroupView中的onInterceptTouchEvent方法返回值为true情况下logcat输出如下(如group2):[/b]
![](http://pic002.cnblogs.com/images/2012/117588/2012061721121824.jpg)
如果在该方法返回值中返回true,那么子控件将获取不到任何点击事件,转而向自身的onTouchEvent方法转发,如下图所示:
![](http://pic002.cnblogs.com/images/2012/117588/2012061721162936.png)
如果onTouchEvent方法返回值都为true,那么根据规律结果就如下图顺序触发:
![](http://pic002.cnblogs.com/images/2012/117588/2012061721190279.png)
最后logcat的结果证实了这一猜测,
![](http://pic002.cnblogs.com/images/2012/117588/2012061721201442.jpg)
根据这一顺序规律我们便可复写GroupView中的onInterceptTouchEvent来控制事件的响应者。 测试程序下载 http://files.cnblogs.com/SCAU_que/EventDemo.rar
相关文章推荐
- [Android应用]对GroupView中onInterceptTouchEvent方法的理解
- 首先是点击事件在不同的布局层次中传递的。 理解Down事件再哪个层次被消费(拦截),后续的Move、Up的点击事件如何传递。 其中ViewGroup中onInterceptTouchEvent方法
- Android事件传递机制以及ViewGroup的onInterceptTouchEvent的理解
- Android ViewGroup onInterceptTouchEvent 和 onTouchEvent
- 探讨Android ViewGroup(Layout)和View中onInterceptTouchEvent和onTouchEvent调用关系详解
- Android 解决滑动冲突的方法--ViewGroup中的requestDisallowInterceptTouchEvent(true)方法
- android ViewGroup的onInterceptTouchEvent 和 onTouchEvent事件
- ViewGroup之onInterceptTouchEvent方法
- Android ViewGroup事件分发机制(requestDisallowInterceptTouchEvent方法)
- (转)Android ViewGroup的onInterceptTouchEvent()事件分析
- ViewGroup的onInterceptTouchEvent()事件分析
- Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
- onInterceptTouchEvent 与 onTouchEvent 分析与MotionEvent在ViewGroup与View中的分发
- 大神语录1 如何滑动fragmentmanager里面一个fragment里面的viewgroup---dispatchTouchEvent 、onInterceptTouchEvent 、onTouchEvent
- Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
- Android中dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的理解
- ViewGroup onInterceptTouchEvent,ViewGroup onTouchEvent,View onTouchEvent执行顺序说明
- View 中的dispatchTouchEvent,OnInterceptTouchEvent ,OnTouchEvent方法
- android中onInterceptTouchEvent()方法详解
- ViewGroup onInterceptTouchEvent,ViewGroup onTouchEvent,View onTouchEvent执行顺序说明