卜娃娃|Behavior实战,这交互炸了系列:仿小米音乐歌手详情页,自定义( 四 )
TopBarBehavior这个Behavior主要处理TopBar部分的两个子View的透明度变化 ,
因为逻辑跟FaceBehavior十分类似就不细说了 。
publicclassTopBarBehaviorextendsCoordinatorLayout.Behavior{privatefloatcontentTransY;//滑动内容初始化TransYprivateinttopBarHeight;//topBar内容高度...publicTopBarBehavior(Contextcontext,AttributeSetattrs){super(context,attrs);//引入尺寸值contentTransY=(int)context.getResources().getDimension(R.dimen.content_trans_y);intresourceId=context.getResources().getIdentifier("status_bar_height","dimen","android");intstatusBarHeight=context.getResources().getDimensionPixelSize(resourceId);topBarHeight=(int)context.getResources().getDimension(R.dimen.top_bar_height)+statusBarHeight;}publicbooleanlayoutDependsOn(@NonNullCoordinatorLayoutparent,@NonNullViewchild,@NonNullViewdependency){//依赖Contentreturndependency.getId()==R.id.ll_content;}publicbooleanonDependentViewChanged(@NonNullCoordinatorLayoutparent,@NonNullViewchild,@NonNullViewdependency){//计算Content上滑的百分比 , 设置子view的透明度floatupPro=(contentTransY-MathUtils.clamp(dependency.getTranslationY(),topBarHeight,contentTransY))/(contentTransY-topBarHeight);ViewtvName=child.findViewById(R.id.tv_top_bar_name);ViewtvColl=child.findViewById(R.id.tv_top_bar_coll);tvName.setAlpha(upPro);tvColl.setAlpha(upPro);returntrue;}}TitleBarBehavior【卜娃娃|Behavior实战,这交互炸了系列:仿小米音乐歌手详情页,自定义】这个Behavior主要处理TitleBar部分在布局位置紧贴Content顶部和关联的View的透明度变化 。
publicclassTitleBarBehaviorextendsCoordinatorLayout.Behavior{privatefloatcontentTransY;//滑动内容初始化TransYprivateinttopBarHeight;//topBar内容高度publicTitleBarBehavior(Contextcontext,AttributeSetattrs){super(context,attrs);//引入尺寸值contentTransY=(int)context.getResources().getDimension(R.dimen.content_trans_y);intresourceId=context.getResources().getIdentifier("status_bar_height","dimen","android");intstatusBarHeight=context.getResources().getDimensionPixelSize(resourceId);topBarHeight=(int)context.getResources().getDimension(R.dimen.top_bar_height)+statusBarHeight;}publicbooleanlayoutDependsOn(@NonNullCoordinatorLayoutparent,@NonNullViewchild,@NonNullViewdependency){//依赖contentreturndependency.getId()==R.id.ll_content;}publicbooleanonDependentViewChanged(@NonNullCoordinatorLayoutparent,@NonNullViewchild,@NonNullViewdependency){//调整TitleBar布局位置紧贴Content顶部adjustPosition(parent,child,dependency);//这里只计算Content上滑范围一半的百分比floatstart=(contentTransY+topBarHeight)/2;floatupPro=(contentTransY-MathUtils.clamp(dependency.getTranslationY(),start,contentTransY))/(contentTransY-start);child.setAlpha(1-upPro);returntrue;}publicbooleanonLayoutChild(@NonNullCoordinatorLayoutparent,@NonNullViewchild,intlayoutDirection){//找到Content的依赖引用Listdependencies=parent.getDependencies(child);Viewdependency=null;for(Viewview:dependencies){if(view.getId()==R.id.ll_content){dependency=view;break;}}if(dependency!=null){//调整TitleBar布局位置紧贴Content顶部adjustPosition(parent,child,dependency);returntrue;}else{returnfalse;}}privatevoidadjustPosition(@NonNullCoordinatorLayoutparent,@NonNullViewchild,Viewdependency){finalCoordinatorLayout.LayoutParamslp=(CoordinatorLayout.LayoutParams)child.getLayoutParams();intleft=parent.getPaddingLeft()+lp.leftMargin;inttop=(int)(dependency.getY()-child.getMeasuredHeight()+lp.topMargin);intright=child.getMeasuredWidth()+left-parent.getPaddingRight()-lp.rightMargin;intbottom=(int)(dependency.getY()-lp.bottomMargin);child.layout(left,top,right,bottom);}}总结自定义Behavior可以实现各种神奇的效果 , 相对于自定义View实现NestedScrolling机制 , Behavior更能解耦逻辑 , 但同时又多了些约束 , 由于本人水平有限仅给各位提供参考 , 希望能够抛砖引玉 , 如果有什么可以讨论的问题可以在评论区留言或联系本人 。
推荐阅读
- 图麟科技|三种能力是关键,四年内将翻一番背后:图麟科技AI落地实战
- 抖音|抖音地图号赚钱项目解析:一天稳赚1000+的实战操作!
- 职场实战经验|却被女研究生嫌弃收入低,原因曝光,网友:太年轻,程序员年薪40万
- 卜娃娃|下五洋捉鳖,5G正悄悄改变中国,5G到底有什么用?上九天揽月
- 萱草|SQL 单表优化,SQL高级:代码实战
- 蓝色星晨|045-添加资源文件,实战PyQt5:
- 卜娃娃|你还敢买电动汽车吗?,广汽新能源特斯拉又烧了
- 小暖男石头哥|OS 编译 Android 源码,真机实战,Mac
- 卜娃娃|美国要急了眼了,一大国与华为展开5G合作
- 产业气象站|Git实战004:branch分支操作详解