实践同方向和不同方向Android滑动冲突解决方案_第1页
实践同方向和不同方向Android滑动冲突解决方案_第2页
实践同方向和不同方向Android滑动冲突解决方案_第3页
实践同方向和不同方向Android滑动冲突解决方案_第4页
实践同方向和不同方向Android滑动冲突解决方案_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论