卜娃娃|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更能解耦逻辑 , 但同时又多了些约束 , 由于本人水平有限仅给各位提供参考 , 希望能够抛砖引玉 , 如果有什么可以讨论的问题可以在评论区留言或联系本人 。


推荐阅读