当前快报:CollapsingToolbarLayout的使用方法介绍
我非常喜欢Material Design里折叠工具栏的效果,bilibili Android客户端视频详情页就是采用的这种设计。这篇文章的第二部分我们就通过简单的模仿bilibili视频详情页的实现来了解下CollapsingToolbarLayout的使用。文章的第三部分介绍了CollapsingToolbarLayout与TabLayout的组合使用。
有基础的朋友可以直接跳过第一部分。
(资料图)
一、相关基础属性介绍
Android studio中有一个Activity模板叫ScrollingActivity,它实现的就是简单的可折叠工具栏,我们将此模板添加到项目中。
ScrollingActivity.gif
ScrollingActivity的布局代码如下
AppBarLayout是一种支持响应滚动手势的app bar布局(比如工具栏滚出或滚入屏幕),CollapsingToolbarLayout则是专门用来实现子布局内不同元素响应滚动细节的布局。
与AppBarLayout组合的滚动布局(Recyclerview、NestedScrollView等)需要设置app:layout_behavior=”@string/appbar_scrolling_view_behavior”(上面代码中NestedScrollView控件所设置的)。没有设置的话,AppBarLayout将不会响应滚动布局的滚动事件。
CollapsingToolbarLayout和ScrollView一起使用会有滑动bug,注意要使用NestedScrollView来替代ScrollView。
AppBarLayout的子布局有5种滚动标识(就是上面代码CollapsingToolbarLayout中配置的app:layout_scrollFlags属性):
scroll:将此布局和滚动时间关联。这个标识要设置在其他标识之前,没有这个标识则布局不会滚动且其他标识设置无效。enterAlways:任何向下滚动操作都会使此布局可见。这个标识通常被称为“快速返回”模式。enterAlwaysCollapsed:假设你定义了一个最小高度(minHeight)同时enterAlways也定义了,那么view将在到达这个最小高度的时候开始显示,并且从这个时候开始慢慢展开,当滚动到顶部的时候展开完。exitUntilCollapsed:当你定义了一个minHeight,此布局将在滚动到达这个最小高度的时候折叠。snap:当一个滚动事件结束,如果视图是部分可见的,那么它将被滚动到收缩或展开。例如,如果视图只有底部25%显示,它将折叠。相反,如果它的底部75%可见,那么它将完全展开。
CollapsingToolbarLayout可以通过app:contentScrim设置折叠时工具栏布局的颜色,通过app:statusBarScrim设置折叠时状态栏的颜色。默认contentScrim是colorPrimary的色值,statusBarScrim是colorPrimaryDark的色值。这个后面会用到。
CollapsingToolbarLayout的子布局有3种折叠模式(Toolbar中设置的app:layout_collapseMode)
off:这个是默认属性,布局将正常显示,没有折叠的行为。pin:CollapsingToolbarLayout折叠后,此布局将固定在顶部。parallax:CollapsingToolbarLayout折叠时,此布局也会有视差折叠效果。
当CollapsingToolbarLayout的子布局设置了parallax模式时,我们还可以通过app:layout_collapseParallaxMultiplier设置视差滚动因子,值为:0~1。
FloatingActionButton这个控件通过app:layout_anchor这个设置锚定在了AppBarLayout下方。FloatingActionButton源码中有一个Behavior方法,当AppBarLayout收缩时,FloatingActionButton就会跟着做出相应变化。关于CoordinatorLayout和Behavior,我下一篇文章会和大家一起学习。
这一堆属性看着有点烦,大家可以新建一个ScrollingActivity模板去实验一下玩玩。
二、模仿bilibili客户端视频详情页
我们先对原界面分析一下。
哔哩哔哩Android客户端视频详情页.gif
界面初始,CollapsingToolbarLayout是展开状态,显示的是视频封面。我们向上滚动界面,CollapsingToolbarLayout收缩。当AppBarLayout完全折叠的时候视频av号隐藏,显示出来一个小电视图标和“立即播放”,点击则使AppBarLayout完全展开,CollapsingToolbarLayout子布局由ImageView切换为视频弹幕播放器。
额…弹幕播放器…
B站很早就开源了一个弹幕引擎,还起了个狂拽酷炫吊炸天的名字叫“烈焰弹幕使 ”(一看就是二次元程序猿们的作品→_→),源码在github上,项目名叫DanmakuFlameMaster。
来我们先看修改完成的布局。
我把colorPrimary的色值修改成了B站的“少女粉”,播放的图标是从网上找的。
#FA7199
因为我们要实现沉浸式状态栏,所以就需要先把整个activity设置成状态栏透明模式。然后在布局文件中,把CollapsingToolbarLayout里要实现沉浸式的控件设置上android:fitsSystemWindows=”true”,如果没有设置,则子布局会位于状态栏下方,未延伸至状态栏。
布局并不算复杂,接下来先实现无弹幕播放时的功能,。
我们需要监听CollapsingToolbarLayout的折叠、展开状态。唉我去,官方并没有提供现成的方法(⊙_⊙?)。
查看源码,可以看到CollapsingToolbarLayout是通过实现AppBarLayout的OnOffsetChangedListener接口,根据AppBarLayout的偏移来实现子布局和title的视差移动以及ContentScrim和StatusBarScrim的显示。那么我们也可以通过调用AppBarLayout的addOnOffsetChangedListener方法监听AppBarLayout的位移,判断CollapsingToolbarLayout的状态。
先写一个枚举定义出CollapsingToolbarLayout展开、折叠、中间,这三种状态。
private CollapsingToolbarLayoutState state; private enum CollapsingToolbarLayoutState { EXPANDED, COLLAPSED, INTERNEDIATE}
接下来对AppBarLayout进行监听,判断CollapsingToolbarLayout的状态并实现相应的逻辑。
为了让大家对状态看着更直观,我在修改状态值的时候把title一起进行了修改。
使用CollapsingToolbarLayout的时候要注意,在完成CollapsingToolbarLayout设置之后再调用Toolbar的setTitle()等方法将没有效果,我们需要改为调用CollapsingToolbarLayout的setTitle()等方法来对工具栏进行修改。(具体原因各位亲去看下CollapsingToolbarLayout源码就知道了 ( ˙-˙ ) )
AppBarLayout app_bar=(AppBarLayout)findViewById(R.id.app_bar); app_bar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (verticalOffset == 0) { if (state != CollapsingToolbarLayoutState.EXPANDED) { state = CollapsingToolbarLayoutState.EXPANDED;//修改状态标记为展开 collapsingToolbarLayout.setTitle("EXPANDED");//设置title为EXPANDED } } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) { if (state != CollapsingToolbarLayoutState.COLLAPSED) { collapsingToolbarLayout.setTitle("");//设置title不显示 playButton.setVisibility(View.VISIBLE);//隐藏播放按钮 state = CollapsingToolbarLayoutState.COLLAPSED;//修改状态标记为折叠 } } else { if (state != CollapsingToolbarLayoutState.INTERNEDIATE) { if(state == CollapsingToolbarLayoutState.COLLAPSED){ playButton.setVisibility(View.GONE);//由折叠变为中间状态时隐藏播放按钮 } collapsingToolbarLayout.setTitle("INTERNEDIATE");//设置title为INTERNEDIATE state = CollapsingToolbarLayoutState.INTERNEDIATE;//修改状态标记为中间 } } } });
然后对播放按钮设置监听,点击则调用AppBarLayout的setExpanded(true)方法使工具栏展开。
CollapsingToolbarLayout状态监听演示.gif
哔哩哔哩客户端的title是固定不动的,可以调用CollapsingToolbarLayout的setTitleEnabled(false)方法实现。
视频播放时,调用 NestedScrollView的setNestedScrollingEnabled(false)方法可以使AppBarLayout不响应滚动事件。
细心的朋友可能发现了哔哩哔哩客户端为了避免视频封面图片颜色过浅影响状态栏信息的显示,加了一个渐变的不透明层。
实现渐变遮罩层很简单。先在res/drawable文件夹下新建了一个名为gradient的xml文件,其中代码如下:
shape节点中,可以通过android:shape来设置形状,默认是矩形。gradient节点中angle的值270是从上到下,0是从左到右,90是从下到上。起始颜色#33000000是20%不透明度的黑色,#00000000表示全透明。
然后在CollapsingToolbarLayout里的ImageView代码下面加上一个自定义view,背景设置为上面的渐变效果。
一般状态栏的高度大概在20dp左右,我为了让渐变效果比较自然,并且不过多影响图(mei)片(zi),把高度设置成了40dp。(状态栏能看清了,妹子脸也没黑,挺好 (๑• . •๑) )
有无渐变遮罩层的对比.jpg
我省略了弹幕播放的相关实现,接下来只要在播放按钮监听中写出封面图片的隐藏、视频和弹幕弹幕控件的显示初始化及播放逻辑,在AppBarLayout的三种状态监听中根据是否视频在播放写出其他相应逻辑就好了,感兴趣的朋友可以下载哔哩哔哩的“烈焰弹幕使”源码DanmakuFlameMaster玩玩。
B站点击追番或投硬币后会出现一个类似Snackbar的提示控件,可以通过我上一篇文章没时间解释了,快使用Snackbar!——Android Snackbar花式使用指南来实现,欢迎感兴趣的朋友去看看。
模仿哔哩哔哩视频详情页.gif
真的不是我懒得上代码了,真的…(基友:赶紧的,开黑了。 我:等等我,马上来!\(≧▽≦)/)
三.CollapsingToolbarLayout与TabLayout
CollapsingToolbarLayout与TabLayout组合使用的效果也不错。
CollapsingToolbarLayout与TabLayout.gif
来看下CollapsingToolbarLayout里的代码
TabLayout没有设置app:layout_collapseMode,在CollapsingToolbarLayout收缩时就不会消失。
CollapsingToolbarLayout收缩时的高度是Toolbar的高度,所以我们需要把Toolbar的高度增加,给TabLayout留出位置,这样收缩后TabLayout就不会和Toolbar重叠。
Toolbar的高度增加,title会相应下移。android:gravity=”top”方法使Toolbar的title位于Toolbar的上方,然后通过app:titleMarginTop调整下title距顶部高度,这样Toolbar就和原来显示的一样了。
CollapsingToolbarLayout还可以和Palette搭配使用,但是我感觉在实际使用中有些坑,因为CollapsingToolbarLayout中的图片不确定,Palette从图片中获取到的色彩很可能不是你想要的。
感兴趣的朋友可以自己查下Palette的用法。
就是这些。 []~( ̄▽ ̄)~*
转自:https://www.jianshu.com/p/06c0ae8d9a96/
标签:
相关推荐:
最新新闻:
- 磁盘被写保护怎么解除?c盘哪些文件可以删除?
- kernelupadate.exe是什么程序?提示已停止工作的解决方法
- chkdsk工具怎么运行?chkdsk工具使用方法命令
- ie打开后自动关闭是怎么回事?ie打开后自动关闭的解决方法
- 弹出winlogon.exe应用程序错误怎么办?弹出winlogon.exe应用程序错误原因分析及解决方法
- 品牌机和组装机有什么区别?品牌机和组装机区别介绍
- 世界滚动:第二章Python入门2.1环境安装 Python详情介绍
- Vagaa搜索不到资源是怎么回事?介绍Vagaa搜索设置技巧及解决方法
- 超级本是什么意思?超级本与笔记本有什么区别?
- 怎么样爬qq好友空间?怎么样爬qq好友空间的留言?
- XP系统支持多大的内存?XP可以支持4G以上的内存吗?
- 不用光盘怎么重装系统?重装系统的详细步骤
- 手机白屏是怎么一回事?诺基亚手机很卡怎么办?
- 电驴未连接到服务器怎么办?电驴现在还能用吗?
- 哪些华硕笔记本电脑的性价比最高?华硕笔记本大全
- 笔记本电池第一次充电要充满吗?笔记本电池怎么取下来?
- 数据寄存器是什么?它的作用有哪些?
- 传奇黑屏补丁怎么用?传奇进去之后黑屏怎么办?
- 语言栏消失如何修复?语言栏消失修复方法
- 百度网盘下载慢怎么办?百度网盘下载慢解决方法
- 遇到d3dx9_42.dll文件丢失该怎么办?遇到d3dx9_42.dll文件丢失解决方法步骤
- 打印机什么牌子好用?打印机品牌推荐 焦点信息
- SWAP是什么?SWAP信令特点介绍
- 手机显示单卡双模什么意思?单卡双模手机特点及分辨方法
- 每日速看!机房设备如何维护?机房日常维护的八点措施
- XP系统工作组计算机无法访问怎么解决?无法访问的解决技巧
- 如何查看电信宽带用时方式流程?查宽带上网时间的方式
- 如何解除dnf的红字?解除dnf红字的方法步骤
- 《使命召唤16》及战区迎来万圣节限时活动 迅游加速器助力流畅体验
- 热文:《红色警戒3:起义时刻》游戏介绍 红色警戒3起义时刻配置要求
- egui.exe是什么进程?如何创建主键?
- 昱怎么读?昱的拼音是什么?昱的含义|动态焦点
- 中国电脑品牌排行榜:联想电脑销售量世界第一_每日视讯
- 每日速看!【设计函数】1010一元多项式求导(25分)设计解析
- Photoshop中overlay方式是什么?Photoshop中的overlay模式:环球时快讯
- 【实验】电容式点动型触摸开关模块控制led灯_即时焦点
- 全球动态:三星i408是多少钱?三星i408报价及详细测评介绍
- 环球速看:看图软件哪个好?看图工具那个好?
- 开源社区网:FileillaClient3.5.2正式版发布|全球快报
- 奇兔刷机怎么用?奇兔刷机使用教程
- 手机tf卡哪个牌子好?选购的注意事项有哪些?|新视野
- 当前快报:CollapsingToolbarLayout的使用方法介绍
- 如何判断浮子上升?压力水位传感器原理及六种方法
- 诺基亚X7-00如何插入存储卡?插入存储卡的方法
- 什么是指纹识别?在笔记本电脑中的应用有哪些? 焦点快看
- 阿里旺旺无法登陆怎么办?阿里旺旺无法登陆的解决措施
- hold是什么意思?hold住的简单介绍|全球资讯
- 全球焦点!elo触摸屏显示器多少钱?elo触摸屏显示器品牌介绍
- 斗牛怎么玩?QQ斗牛作弊器怎么用?|每日视点
- 主机"键鼠狗"被制裁!育碧将推出《彩虹六号:围攻》键鼠反作弊
- 《守望先锋2》开发人员:炸鱼行为困扰颇深
- 《大侠立志传》抢先体验版本登陆Steam 首发优惠价60元
- 《命运2》新增隐藏异域武器任务 可获Vex偃月
- 美国两架飞机相撞坠入湖中:至少1人死亡 飞机残骸漂浮画面曝光
- 调整人才结构聚焦供需错配,找工呀为汽车行业蓝领人才困境提供解决方案
- iPhone 15真机曝光 直角边框有弧度了
- 当前看点!追觅吸尘器女神节抖音专场:解放双手,追求更好的自己
- R7-7735HS神U加持!粉色限定色迷你主机低至2499元
- iPhone 14黄色版开箱:香蕉黄外观不错
- 世界动态:instead和insteadof的区别是什么?instead和insteadof的含义
- 光纤宽带的电话线是怎么用的?光纤宽带和ADSL宽带有什么区别? 环球播资讯
- Sta和Stakeholder是什么意思?Sta和Stakeholder有什么区别?
- 什么是OTS?阿里云飞天分布式系统之上的数据库 微动态
- 今日热议:【技术】设备控制用通讯协定——GEM&Control
- 十进制数如何转换为浮点数?十进制数转换为浮点数的方法
- 全球观点:Cosmos-1-理论知识全解析 gumptlu.work/Cosmos-pdf下载教程
- 如何在搜寻数据库时快速找到档案?locate命令用法举例
- METER功能信号的分类及频谱分析
- 案例分享:感染Synaptics蠕虫病毒的360安全卫士
- find命令详解 linux下find命令的使用方法
- 什么是Oops?linux之Oops原理及解析|动态
- 天天实时:CAP为什么没有明确考虑收敛性?分布式系统中的收敛性
- 密锣紧鼓地开发年度盛典 BigoLive前端营收组同比更佳|当前热文
- ExcelOOP函数怎么使用?Excel中VLOOKUP函数的详细用法
- 用比特彗星如何下载?路由器端口映射教程