事件分发,事件消费,事件传递机制

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事件分发机制

Android开发——事件分发机制详解---微信鱼虾蟹源码搭建

Android事件传递

Android 事件分发事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )

浅谈Android 事件分发机制

Android事件分发机制