卜娃娃|Behavior实战,这交互炸了系列:仿小米音乐歌手详情页,自定义( 三 )


场景2:从初始化状态快速下滑转为展开状态 , 这也和和前面onNestedPreScroll()处理上滑的效果一模一样 , 因此可以复用逻辑 。
场景3:从折叠状态快速下滑转为初始化状态 , 这个过程如下图 , 看起来像是快速下滑停顿的效果 。
publicvoidonDetachedFromLayoutParams(){if(restoreAnimator.isStarted()){restoreAnimator.cancel();restoreAnimator.removeAllUpdateListeners();restoreAnimator.removeAllListeners();restoreAnimator=null;}super.onDetachedFromLayoutParams();}FaceBehavior
这个Behavior主要处理Face部分的ImageView的位移、蒙层的透明度变化 , 这里因为篇幅原因 , 只讲解关键方法 , 具体源码见
publicclassFaceBehaviorextendsCoordinatorLayout.Behavior{privateinttopBarHeight;//topBar内容高度privatefloatcontentTransY;//滑动内容初始化TransYprivatefloatdownEndY;//下滑时终点值privatefloatfaceTransY;//图片往上位移值publicFaceBehavior(Contextcontext,AttributeSetattrs){super(context,attrs);//引入尺寸值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;contentTransY=(int)context.getResources().getDimension(R.dimen.content_trans_y);downEndY=(int)context.getResources().getDimension(R.dimen.content_trans_down_end_y);faceTransY=context.getResources().getDimension(R.dimen.face_trans_y);...}publicbooleanlayoutDependsOn(@NonNullCoordinatorLayoutparent,@NonNullViewchild,@NonNullViewdependency){//依赖ContentViewreturndependency.getId()==R.id.ll_content;}publicbooleanonDependentViewChanged(@NonNullCoordinatorLayoutparent,@NonNullViewchild,@NonNullViewdependency){//计算Content的上滑百分比、下滑百分比floatupPro=(contentTransY-MathUtils.clamp(dependency.getTranslationY(),topBarHeight,contentTransY))/(contentTransY-topBarHeight);floatdownPro=(downEndY-MathUtils.clamp(dependency.getTranslationY(),contentTransY,downEndY))/(downEndY-contentTransY);ImageViewiamgeview=child.findViewById(R.id.iv_face);ViewmaskView=child.findViewById(R.id.v_mask);if(dependency.getTranslationY()>=contentTransY){//根据Content上滑百分比位移图片TransitionYiamgeview.setTranslationY(downPro*faceTransY);}else{//根据Content下滑百分比位移图片TransitionYiamgeview.setTranslationY(faceTransY+4*upPro*faceTransY);}//根据Content上滑百分比设置图片和蒙层的透明度iamgeview.setAlpha(1-upPro);maskView.setAlpha(upPro);//因为改变了child的位置 , 所以返回truereturntrue;}}其实从上面代码也可以看出逻辑非常简单 , 在layoutDependsOn()依赖Content , 在onDependentViewChanged()里计算Content的上、下滑动百分比来处理图片和蒙层的位移、透明变化 。