版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实践-同方向和不同方向Android滑动冲突解决方案说明:AndroidDeveloper.jpeganMOD为了文章简洁,下面将用简写代替控件或方法全称。总控件:VG代替ViewGroup纵向控件:*SRL代替SwipeRefreshLayout*TL代替TabLayoutSV代替ScrollView*RV代替RecyclerViewLV代替ListView横向控件:VP代替ViewPagerSM代替SlideMenu事件传递:disTE代替dispatchTouchEvent(事件分发)onITE代替onlnterceptTouchEvent(事件拦截)onTE代替onTouchEvent
2、(事件消费)reDITE代替requestDisallowlnterceptTouchEvent(子View要求父View不要拦截事件)setOTL代替setOnTouchListenerView事件分发机制如果大家不了解View的事件分发机制,可以参看文章:事件冲突实际上就是对事件分发机制的应用。解决事件冲突总结来看有下列几种方法:父View#onITE方法:决定事件是否向子View传递。子View#disTE方法:通过reDITE来干预父View事件的分发。子View#setOTL方法:通过reDITE来干预父View事件的分发。注意:标志位在MOVE事件和DOWN事件中都会起作用。滑动冲
3、突分为三种情况:同方向;不同方向;同方向和不同方向混合。同方向:核心要点:保证外部滑动的时候只滑动外部,内部滑动的时候只滑动内部。点击事件交给合适的View处理。冲突场景:只有一层能滑动;内外层同时滑动很卡顿。1.SRL+SV/RV:没有冲突。分析:SRL:重写了onITE方法。向下滑动,Y轴距离大于最小滑动距离,拦截事件,效果正常。SV/RV:没有重写disTE方法。向上滚动,效果正常。2.SV+SV:有滑动冲突。问题:内部不能滑动。分析:外部Y轴距离大于最小滑动距离,拦截事件,导致内部不能滑动。解决:内部拦截:内部滑动时,执行getparent().reDITE(true);publicc
4、lassSV_SV_innerextendsScrollViewpublicSV_SV_inner(Contextcontext)super(context);publicSV_SV_inner(Contextcontext,AttributeSetattrs)super(context,attrs);OverridepublicbooleandispatchTouchEvent(MotionEventev)getParent().requestDisallowlnterceptTouchEvent(true);returnsuper.dispatchTouchEvent(ev);外部拦截:p
5、ublicclassSV_SV_outerextendsScrollViewpublicSV_SV_outer(Contextcontext)super(context);publicSV_SV_outer(Contextcontext,AttributeSetattrs)super(context,attrs);OverridepublicbooleanonlnterceptTouchEvent(MotionEventev)super.onlnterceptTouchEvent(ev);returnfalse;3.SV+RV:有滑动冲突。问题:内层在滑动时,外层也在滑动,滑动很卡顿。分析:S
6、V:重写了onlnterceptTouchEvent方法。当Y轴移动距离大于最小滑动距离时,就会拦截事件,否则向子View传递。RV:没有重写dispatchTouchEvent方法。解决:内部拦截:内部滑动时,通过reDITE设置为true使事件向子View分发。通过打印日志会发现:当内部滑动的时候,外部没有在滑动。效果实现。publicclassSV_RV_innerextendsRecyclerViewpublicSV_RV_inner(Contextcontext)super(context);publicSV_RV_inner(Contextcontext,NullableAttri
7、buteSetattrs)super(context,attrs);OverridepublicbooleandispatchTouchEvent(MotionEventev)getParent().requestDisallowlnterceptTouchEvent(true);if(ev.getAction()=MotionEvent.ACTION_MOVE)Log.d(SV_RV,dispatchTouchEvent:内层在滑动+);returnsuper.dispatchTouchEvent(ev);4.VP+VP:没有滑动冲突。分析:打印日志发现:外部滑动的时候内部没有滑动,内部滑动
8、的时候外部没有滑动。综上,同一方向有滑动冲突的有两个例子:只有一层能滑动的例子:SV+SV内外层同时滑动很卡顿的例子:SV+RV不同方向:核心点:判断谁来拦截:根据滑动是水平滑动还是竖直滑动来判断到底由谁来拦截事件。判断滑动方向:根据滑动过程中两点之间的坐标滑动路径和水平方向所形成的夹角(滑动角度)水平和竖直方向距离差(距离差)(常用)水平和竖直方向速度差(速度差)滑动冲突出现的根本原因:上层View拦截了下层View导致下层View无法滑动。1.SRL+VP:问题:VP左下右下滑动时,SRL也在上下滑动SRL拦截掉了VP的滑动事件。分析:SRL源码:Y轴大于最小滑动距离时,父View拦截事件
9、,否则不拦截。解决:内部拦截:SRL_VP_outer:publicclassSRL_VP_outerextendsSwipeRefreshLayoutpublicSRL_VP_outer(Contextcontext)super(context);publicSRL_VP_outer(Contextcontext,AttributeSetattrs)super(context,attrs);OverridepublicbooleanonlnterceptTouchEvent(MotionEventev)if(ev.getAction()=MotionEvent.ACTION_DOWN)sup
10、er.onInterceptTouchEvent(ev);returnfalse;returnsuper.onInterceptTouchEvent(ev);SRL_VP_inner:publicclassSRL_VP_innerextendsViewPagerprivatefloatstartX;privatefloatstartY;privatefloatx;privatefloaty;privatefloatdeltaX;privatefloatdeltaY;publicSRL_VP_inner(Contextcontext)super(context);publicSRL_VP_inn
11、er(Contextcontext,AttributeSetattrs)super(context,attrs);OverridepublicbooleandispatchTouchEvent(MotionEventev)switch(ev.getAction()caseMotionEvent.ACTION_DOWN:startX=ev.getX();startY=ev.getY();注释1ViewCompat.setNestedScrollingEnabled(this,true);getParent().requestDisallowlnterceptTouchEvent(true);break;caseMotionEvent.ACTION_MOVE:x=ev.getX();y=ev.getY();deltaX=Math.abs(x-startX);deltaY=Math.abs(y-startY);if(deltaXdeltaY)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026黑龙江哈尔滨工业大学建筑与设计学院建筑数字化设计与技术研究所招聘人工智能工程师备考题库含完整答案详解【全优】
- 2026中国能建中电工程中南院春季校园招聘8人备考题库含答案详解【巩固】
- 2026江西新余开物金服科技有限公司招聘备考题库及参考答案详解(达标题)
- 2026江西萍乡市融资担保集团有限公司招聘员工4人备考题库含答案详解(研优卷)
- 2026云南曲靖市陆良县人力资源和社会保障局招聘公益性岗位3人备考题库【培优b卷】附答案详解
- 2026西藏萨迦融媒体中心招聘农村电影放映员2人备考题库含答案详解(基础题)
- 2026安徽马鞍山和县科技职业学校校园招聘2人备考题库附完整答案详解【名师系列】
- 2026太平洋证券有限责任公司招聘5人备考题库附参考答案详解(能力提升)
- 2206北京大学未来技术学院招聘劳动合同制人员1人备考题库(易错题)附答案详解
- 2026河北邯郸幼儿师范高等专科学校春季博硕人才选聘26人备考题库(真题汇编)附答案详解
- DB5301∕T 102-2024 应用软件定制开发成本测算指南
- 2025护理分级新标准
- GB/T 42124.3-2025产品几何技术规范(GPS)模制件的尺寸和几何公差第3部分:铸件尺寸公差、几何公差与机械加工余量
- T/TMAC 084-2024煤电环保智能化控制平台建设指南
- T/CTRA 01-2020废轮胎/橡胶再生油
- DB31/T 1363-2022口腔综合治疗台水路卫生管理要求
- 可信数据空间解决方案星环科技
- 啦啦操队形变化设计与编排
- 《公路工程质量控制》课件
- 物联网工程专业本科主干课程教学大纲
- 酒店厨房安全培训课件
评论
0/150
提交评论