事件分发,事件消费,事件传递机制
Posted Tears_fg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事件分发,事件消费,事件传递机制相关的知识,希望对你有一定的参考价值。
0.学习目的:
1.解决开发中点击冲突,滑动冲突
drawerLayout点击穿透
viewpager嵌套viewpager左右滑动的时候冲突
2.深入了解android事件机制
1.事件
1.事件包括:点击,双击,长按,滑动,拖拽,多点触控,组成了Android的事件
2.事件动作组成:
1.ACTION_DOWN 按下事件, 所有的事件都是从按下开始的
2.ACTION_MOVE 移动事件 ,按下后移动
3.ACTION_UP 弹起事件, 手指离开
3.事件的传递过程
按下(屏幕) -- 系统 --- 应用 --- activity --- viewgroup1 --- viewgroup2* .... view (没有子控件,总结的view)
1.为什么activity中没有onInterceptTouchEvent方法?
activity使用来与用户进行交互的,如果事件不传递,无意义
2.为什么view中没有onInterceptTouchEvent方法
没有包含的子控件,事件不需要传递
2.验证事件传递机制
TouchEvent的传递
事件拦截
1.事件 -- A dispatch --- VP dispatch ----V dispatch ---V touchEvent
1.----false--- V dispatch false --- VP toucheEvent false --- VP dispatch false --- A dispatch false
2.----true --- V dispatch true ---- VP dispatch true --- A dispatch true
view的onTouchEvent的返回值:
textview --- 返回 false
button ---- 返回true
原因: 在onTouchEvent方法里面, 如果view的clickable 为false或者 longClickAble为false,则view的onTouchEvent方法直接返回false
如何让textview可以点击,并返回true:
1.设置是否可以点击
1.tvTest.setClickable(true);
2.tvTest.setLongClickable(true);
3.xml属性中设置android:Clickable = true
2.setOnclickListener方法,默认会执行tvTest.setClickable(true);
setOnLongClickListener方法,,默认会执行tvTest.setLongClickable(true);
.onTouch方法
1.设置触摸监听
/*触摸监听*/
btnTest.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("AAA", "MainActivity--button-onTouch");
return true;
}
});
2.该方法在view的dispatchEvent方法中执行
3.返回值true表示消耗该事件,false不消耗
4.如果返回True, 不会执行onTouchEvent方法,返回false,会执行onTouchEvent方法
5.点击事件是在onTouchEvent方法中判断并调用的
6.返回为true不会执行onClick方法
以上是关于事件分发,事件消费,事件传递机制的主要内容,如果未能解决你的问题,请参考以下文章
Android开发——事件分发机制详解---微信鱼虾蟹源码搭建