您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

Android:嵌套滑动摘要 <网站代码>

  • 时间:2022-09-05 02:17 编辑: 来源: 阅读:339
  • 扫一扫,手机访问
摘要:Android:嵌套滑动摘要 <网站代码>
这个好像比较复杂,不如记录下来解释一下。 Https://blog.csdn.net/recall2012/article/details/79474172 1号。什么是滑动嵌套?有一个带滑动功能的视图,然后嵌套另一个带滑动功能的视图,比如recyclerview嵌套recyclerview。 二。什么是CoordinatorLayout?它是一个协调布局,一个超级框架布局,可以控制多个视图的协调移动。 通过行为来实现。 主要原理是,子视图得到滑动事件后,滑动前,先询问父视图是否滑动。如果父视图要滑动,那就滑动,然后告诉子视图滑动后剩余的距离,然后子视图再滑动。 所以,如果解决不好,就可以滑起来。比如父亲的视野滑一点,然后孩子的视野滑一点,你就会感受到卡卡的痛苦。 3.行为怎么了?公共静态抽象类行为& ltv扩展视图& gt{ public void onnested scroll(@ NonNull coordinator layout coordinator layout,@NonNull V child,@NonNull View target,int dxConsumed,int dyConsumed,int dxUnconsumed,int dyUnconsumed,@ nested scroll type int type){ if(type = = View compat。TYPE _ TOUCH){ onnested scroll(coordinator layout,child,target,dxConsumed,dyConsumed,dxUnconsumed,dyun consumed);} } @ Deprecated public void onNestedPreScroll(@ NonNull coordinator layout coordinator layout,@NonNull V child,@NonNull View target,int dx,int dy,@NonNull int[] consumed){//Do nothing } public void onNestedPreScroll(@ NonNull coordinator layout coordinator layout,@NonNull V child,@NonNull View target,int dx,int dy,@ NonNull int[]consumed,@ nestedscroll type int type){ if(type = = View compat。TYPE _ TOUCH){ onNestedPreScroll(coordinator layout,child,target,dx,dy,consumed);} } public boolean onNestedFling(@ NonNull coordinator layout coordinator layout,@NonNull V child,@NonNull View target,float velocityX,float velocityY,boolean consumed){ return false;} public boolean onNestedPreFling(@ NonNull coordinator layout coordinator layout,@NonNull V child,@NonNull View target,float velocityX,float velocity y){ return false;} ......是一个通用类,看起来有点像NestedScrollingParent的方法。 例如,我们来看看onDependentViewChanged是如何调用的。从image.png可以看出,CoordinatorLayout注册了PreDraw的监听器,也就是在绘制视图之前,会回调一个回调函数给onChildViewsChanged,如果(b!= null & amp& ampb . layoutdependenson(this,check child,child)){//首先检查依赖视图是否有变化...//依赖视图发生了变化,回调到需要协调运动的视图handled = b . ondependentviewchanged(this,check child,child);....}我们再来看另一个场景,就是使用onNestedPreScroll实现的协调运动。 例如社稷/BehaviorDemo的二测。 查看他的backtraceimage.png,可以看到事件来自recyclerview,所以在move事件到达recyclerview后,recyclerview被用作NestedScrollingChild2。我将首先将CoordinatorLayout循环为NestedScrollingParent2。需要滑动CoordinatorLayout并解决move事件吗?解决CoordinatorLayou后,recyclerview将继续运行。 看,有意思的是子视图和父视图都消费move事件。 recyclerview调用dispatchNestedPreScroll后,实际上是通过使用NestedScrollingChildHelper,public boolean dispatchNestedPreScroll(intdx,intdy,@Nullable int[] consumed,@Nullable int[] offsetInWindow,@ nestedscroll type int type){ if(isnestedScrollingEnabled()){//确定是否可以支持嵌套滑动,我们经常可以关闭嵌套滑动视图parentcompat。onnestedpresscroll (parent,mview,dx,},然后,最后我们会回到CoordinatorLayout,然后CoordinatorLayout会遍历每个子视图,子视图可以根据需要确定是否可以求解。 4.分析BottomSheetBehavior布局过程的绘制过程@ override @ suppress warnings(" unchecked ")Protected void onlayout(boolean changed,int l,int t,int r,int b){ final Behavior Behavior = LP . get Behavior();//获取childview的行为,然后调用行为的onLayoutChild进行布局。 如果没有behavior,则取onlayoutchild if(behavior = = null | |!behavior.onLayoutChild(this,Child,layout direction)){ onLayoutChild(child,layout direction);}}}如您所见,如果您有一个配置行为的视图,您将采用行为的onLayoutChild方法。 所以布局方法被行为接管了。 viewDragHelper = viewDragHelper . create(parent,drag callback);其实最后,@ override public boolean onlayoutchild(@ nonnull coordinator layout parent,@ nonnull vchild,int layout direction){ if(STATE = = STATE _ EXPANDED){ view compat . offsettopandbottom(child,getexpandoffset());} else if(STATE = = STATE _ HALF _ EXPANDED){ view compat . offsettopandbottom(child,HALF EXPANDED offset);} else if(hideable & amp;& ampSTATE = = STATE _ HIDDEN){ view compat . offsettopandbottom(child,parentHeight} else if(STATE = = STATE _ COLLAPSED){ view compat . offsettopandbottom(child,collapsedOffset);} else if(STATE = = STATE _ drawing | | STATE = = STATE _ SETTLING){ view compat . offsettopandbottom(child,saved top-child . gettop());}}五、底板嵌套recyclerview后,recyclerview关闭嵌套滑块后,滑动recyclerview,底板会移动吗?是的,不要以为当嵌套的幻灯片关闭时,父视图不会阻止事件。实际上,当父视图在slopmove中时,它会直接阻止移动事件。 image.png盖帽后,是如何把它拖到整场比赛的?实际上,image.png被屏蔽后,事件会转到CoordinatorLayout,然后调用行为,行为使用ViewDragHelper拖动行为配置的视图在线移动。 关键是下面这个功能确认能不能屏蔽。如果它返回true,它将被阻止。因为touchingScrollingChild为false,所以最终返回true。 如果recyclerview设置了NestedScrollingEnabled,则touchingScrollingChild为true。最后,如果这个函数返回false,父视图不会阻止它,move事件会直接到达recyclerview。 @ Override public boolean tryCaptureView(@ NonNull View child,int pointerId) { Log.i("fengfeng "," tryCaptureView start:"+" child = "+child+" pointId = "+pointerId+" state = "+state);if(STATE = = STATE _ drawing){ log . I(" Fengfeng "," tryCaptureView false 1 ");返回false} if(touchingScrollingChild){ log . I(" Fengfeng "," tryCaptureView false 2 ");返回false} if(STATE = = STATE _ EXPANDED & amp;& ampactivePointerId = = pointerId){ View scroll = nestedScrollingChildRef!= null?nestedscrollingchildref . get():null;如果(滚动!= null & amp& ampscroll . can scroll vertically(-1)){//让内容向上滚动Log.i("fengfeng "," tryCaptureView false 3 ");返回false} } Log.i("峰峰"," tryCaptureView true 4 ");返回viewRef!= null & amp& ampview ref . get()= = child;} @ Override public boolean tryCaptureView(@ NonNull View child,int pointerId) { Log.i("fengfeng "," tryCaptureView start:"+" child = "+child+" pointId = "+pointerId+" state = "+state);if(STATE = = STATE _ drawing){ log . I(" Fengfeng "," tryCaptureView false 1 ");返回false} if(touchingScrollingChild){ log . I(" Fengfeng "," tryCaptureView false 2 ");返回false} if(STATE = = STATE _ EXPANDED & amp;& ampactivePointerId = = pointerId){ View scroll = nestedScrollingChildRef!= null?nestedscrollingchildref . get():null;如果(滚动!= null & amp& ampscroll . can scroll vertically(-1)){//让内容向上滚动Log.i("fengfeng "," tryCaptureView false 3 ");返回false} } Log.i("峰峰"," tryCaptureView true 4 ");返回viewRef!= null & amp& ampview ref . get()= = child;}touchingScrollingChild被赋给了down事件,这意味着point中有一个可滚动的视图。例如,recyclerview可以滚动。 案例运动事件。ACTION_DOWN: if (state!= STATE _ SETTLING){ View scroll = nestedScrollingChildRef!= null?nestedscrollingchildref . get():null;如果(滚动!= null & amp& ampparent . ispointinchildbounds(scroll,initialX,initial y)){ touchingScrollingChild = true;} }


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部