卜娃娃|Behavior实战,这交互炸了系列:仿小米音乐歌手详情页,自定义
作者:彭冠铭
链接:
完全是使用嵌套滚动机制实现的 , 当时就有很多留言说CoordinatorLayout也能实现 , 确实 , 这不文章就来了 。
作者这个系列一共4篇 , 2篇基础 , 2篇实战 , 如果你能完全吸收 , 基本玩转嵌套滚动 。
PS:感谢大家 , 昨天很给力 , 让我褥了好几年...
1、概述之前的《浅析NestedScrolling嵌套滑动机制之CoordinatorLayout.Behavior》带大家了解CoordinatorLayout.Behavior的原理和基本使用 , 这篇文章手把手基于自定义Behavior实现小米音乐歌手详情页 。
效果预览
topBarHeight;//topBar高度contentTransY;//滑动内容初始化TransYdownEndY;//content下滑的最大值content部分的上滑范围=[topBarHeight,contentTransY]content部分的下滑范围=[contentTransY,downEndY]2、代码实现布局
下面是布局要点 , 侧重于控件的尺寸和位置 , 完整布局请参考:
<android.support.design.widget.CoordinatorLayoutandroid:layout_width="match_parent"android:layout_height="match_parent">mimusicbehavior.widget.DrawableLeftTextView.../>ContentBehavior这个Behavior主要处理Content部分的Measure、嵌套滑动 。
绑定需要做效果的View、引入Dimens、测量Content部分的高度从上面图片能够分析出:
折叠状态时 , Content部分高度=满屏高度-TopBar部分的高度
publicclassContentBehaviorextendsCoordinatorLayout.Behavior{privateinttopBarHeight;//topBar内容高度privatefloatcontentTransY;//滑动内容初始化TransYprivatefloatdownEndY;//下滑时终点值privateViewmLlContent;//Content部分publicContentBehavior(Contextcontext){this(context,null);}publicContentBehavior(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);...}@OverridepublicbooleanonMeasureChild(@NonNullCoordinatorLayoutparent,Viewchild,intparentWidthMeasureSpec,intwidthUsed,intparentHeightMeasureSpec,intheightUsed){finalintchildLpHeight=child.getLayoutParams().height;if(childLpHeight==ViewGroup.LayoutParams.MATCH_PARENT||childLpHeight==ViewGroup.LayoutParams.WRAP_CONTENT){//先获取CoordinatorLayout的测量规格信息 , 若不指定具体高度则使用CoordinatorLayout的高度intavailableHeight=View.MeasureSpec.getSize(parentHeightMeasureSpec);if(availableHeight==0){availableHeight=parent.getHeight();}//设置Content部分高度finalintheight=availableHeight-topBarHeight;finalintheightMeasureSpec=View.MeasureSpec.makeMeasureSpec(height,childLpHeight==ViewGroup.LayoutParams.MATCH_PARENT?View.MeasureSpec.EXACTLY:View.MeasureSpec.AT_MOST);//执行指定高度的测量 , 并返回true表示使用Behavior来代理测量子Viewparent.onMeasureChild(child,parentWidthMeasureSpec,widthUsed,heightMeasureSpec,heightUsed);returntrue;}returnfalse;}@OverridepublicbooleanonLayoutChild(@NonNullCoordinatorLayoutparent,@NonNullViewchild,intlayoutDirection){booleanhandleLayout=super.onLayoutChild(parent,child,layoutDirection);//绑定ContentViewmLlContent=child;returnhandleLayout;}}实现NestedScrollingParent2接口onStartNestedScroll()ContentBehavior只处理Content部分里可滑动View的垂直方向的滑动 。
推荐阅读
- 图麟科技|三种能力是关键,四年内将翻一番背后:图麟科技AI落地实战
- 抖音|抖音地图号赚钱项目解析:一天稳赚1000+的实战操作!
- 职场实战经验|却被女研究生嫌弃收入低,原因曝光,网友:太年轻,程序员年薪40万
- 卜娃娃|下五洋捉鳖,5G正悄悄改变中国,5G到底有什么用?上九天揽月
- 萱草|SQL 单表优化,SQL高级:代码实战
- 蓝色星晨|045-添加资源文件,实战PyQt5:
- 卜娃娃|你还敢买电动汽车吗?,广汽新能源特斯拉又烧了
- 小暖男石头哥|OS 编译 Android 源码,真机实战,Mac
- 卜娃娃|美国要急了眼了,一大国与华为展开5G合作
- 产业气象站|Git实战004:branch分支操作详解