事件分发,事件消费,事件传递机制
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方法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 我干了两个月的大项目,开源了!
· 推荐一款非常好用的在线 SSH 管理工具
· 千万级的大表,如何做性能调优?
· 盘点!HelloGitHub 年度热门开源项目
· Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,