(转载)自定义CoordinatorLayout的Behavior(2):实现淘宝和QQ ToolBar透明渐变效果
自定义CoordinatorLayout的Behavior(2):实现淘宝和QQ ToolBar透明渐变效果
每天用淘宝和QQ 会发现淘宝的商品详情页和qq的好友动态页都不约而同的用了工具栏透明渐变效果,淘宝是为了不挡住商品图片,qq设置为了不挡住header image背景,效果感觉还挺好看,老有人问怎么做的。
那我们来分析一下他们的效果
淘宝效果:图片向上滑动的时候,toolbar慢慢的由透明变成完全不透明,向下滑动则相反
QQ效果:(请自行查看手机,模拟器打死都安装不了,录不了gif) qq的效果类似不过有点不同 下面会分析
看完他们的效果我们可以发现:
- 页面进来 toolbar开始都是透明的
- 向上滑动 toolbar的透明度由透明变成透明,再向下滑动时,又由不透明变成透明
但是仔细体验会发现它们还是有一点点不同,qq的好友动态是要滑到快要出现文字时才会瞬间变成不透明,看下面的图大概能理解了(数字代表alpha 0为完全透明 0-255表示0-100的透明度 255表示完全不透明)
可以看到QQ的渐变区间小的多 也就是一瞬间就变了透明度
好了 简单看了别人家的效果 下面我们要自己来简单实现一下了
1.布局
淘宝和QQ的布局总体看都是一样的 toolbar +可滑动内容区(header+列表)
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="@dimen/header_height" //图片高度为250dp
android:scaleType="centerCrop"
android:src="@mipmap/header"/>
<TextView
style="@style/TextAppearance.AppCompat.Display2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="你的状态\n朋友1的状态\n朋友2的状态\n朋友3的状态\n朋友4的状态\n朋友5的状态\n朋友6的状态\n朋友7的状态\n朋友8的状态\n朋友9的状态\n朋友10的状态\n朋友11的状态\n朋友12的状态\n朋友13的状态\n朋友14的状态\n朋友15的状态\n朋友16的状态"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_behavior"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_behavior="liuwp.com.attendance.activity.ToolbarAlphaBehavior"
/>
</android.support.design.widget.CoordinatorLayout>
上面可滑动部分为了简单起见用了NestedScrollView,当然你可以可以换成RecyleView,里面包含了一个固定高度的图片和文字列表 很简单的布局。
2.实现自定义的ToolbarAlphaBehavior
原理就是根据滑动的偏移值来设置对应的toolbar透明度(看上面的渐变区间分析图一目了然) 实现也就几行代码(就喜欢几行代码的感觉)
public class ToolbarAlphaBehavior extends CoordinatorLayout.Behavior<Toolbar> {
private static final String TAG = "ToolbarAlphaBehavior";
private int offset = 0;
private int startOffset = 0;
private int endOffset = 0;
private Context context;
public ToolbarAlphaBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, Toolbar child, View directTargetChild, View target, int nestedScrollAxes) {
return true;
}
@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout, Toolbar toolbar, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
startOffset = 0;
endOffset = context.getResources().getDimensionPixelOffset(R.dimen.header_height) - toolbar.getHeight();
offset += dyConsumed;
if (offset <= startOffset) { //alpha为0
toolbar.getBackground().setAlpha(0);
} else if (offset > startOffset && offset < endOffset) { //alpha为0到255
float precent = (float) (offset - startOffset) / endOffset;
int alpha = Math.round(precent * 255);
toolbar.getBackground().setAlpha(alpha);
} else if (offset >= endOffset) { //alpha为255
toolbar.getBackground().setAlpha(255);
}
}
}
没错就这么几行代码,主要代码都在onNestedScroll方法里面
3.配置Behavior
给Toolbar配置Behavior
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_behavior"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_behavior="liuwp.com.attendance.activity.ToolbarAlphaBehavior" //添加配置
/>
因为一开始页面进来toolbar就是透明的 别忘了初始化透明度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_behavior);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_behavior);
toolbar.getBackground().setAlpha(0);//toolbar透明度初始化为0
}
然后就ok了
4.结束
最后看下我们的效果
恩 还不错 是不是觉得分分钟就搞定了 当然这里只是简易实现 给大家一个思路,用在实际产品开发中 亲 可能要考虑更多东西哦。
(转载)自定义CoordinatorLayout的Behavior(2):实现淘宝和QQ ToolBar透明渐变效果的更多相关文章
- 使用VPN服务器解决公司不能上淘宝的问题
很多公司为了保证员工的效率,通常采用屏蔽端口的方法屏蔽掉了一些网站,比如淘宝.QQ网页版等,这样做虽然也是公司的迫不得已,但是也有点不人性化,毕竟非上班时间也是上不去此类网站的.前些日子电商大站,抢不 ...
- 淘宝内部分享:怎么跳出MySQL的10个大坑
编者按:淘宝自从2010开始规模使用MySQL,替换了之前商品.交易.用户等原基于IOE方案的核心数据库,目前已部署数千台规模.同时和Oracle, Percona, Mariadb等上游厂商有良好合 ...
- 淘宝内部分享:MySQL & MariaDB性能优化
发表于2015-01-20 16:26| 28875次阅读| 来源mysql.taobao.org| 22 条评论| 作者淘宝数据库团队 MySQL性能优化淘宝数据库 摘要:MySQL是目前使用最多的 ...
- 关于CoordinatorLayout与Behavior的一点分析
Behavior是Android新出的Design库里新增的布局概念.Behavior只有是CoordinatorLayout的直接子View才有意义.可以为任何View添加一个Behavior.Be ...
- [置顶]
针对 CoordinatorLayout 及 Behavior 的一次细节较真
我认真不是为了输赢,我就是认真.– 罗永浩 我一直对 Material Design 很感兴趣,每次在官网上阅读它的相关文档时,我总会有更进一步的体会.当然,Material Design 并不是仅仅 ...
- 我的面板我做主 -- 淘宝UWP中自定义Panel的实现
在Windows10 UWP开发平台上内置的XMAL布局面板包括RelativePanel.StackPanel.Grid.VariableSizedWrapGrid 和 Canvas.在开发淘宝UW ...
- Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片
Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...
- OAuth2 通用组件源码下载(支持新浪微博、QQ、淘宝)(转载)
转载地址:http://www.cyqdata.com/download/article-detail-54302 OAuth2 社区通用组件说明: 源码为C#(.NET)写成,目前支持新浪微博. ...
- android电子书App、自定义图表、仿腾讯漫画App、仿淘宝优惠券、3D选择容器等源码
Android精选源码 仿支付宝记账本功能,饼状图:数字键盘 android一款功能完善的电子书应用源码 Android自定义图标库,使用方便,扩展性强 android 3D立体无限旋转容器源码 an ...
随机推荐
- 【转】VMWare vCenter 6.0安装配置
版权声明: 专注于"GIS+"前沿技术的研究与交流,将云计算技术.大数据技术.容器技术.物联网与GIS进行深度融合,探讨"GIS+"技术和行业解决方案:文章允许 ...
- javaee字符文件的复制
package Zy; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWrit ...
- json-lib与Jackson的区别和用法分析
一.Jackson概述 1.jackson包和版本 Jackson fasterxml和codehaus的区别: 他们是Jackson的两大分支.也是两个版本的不同包名.Jackson从2.0开始改用 ...
- Labview学习笔记(二)
一.编程基础 LABVIEW程序成为虚拟.仪器程序,简称VI,一个最基本的VI包括三个部分:前面板.程序框图和图标/连接端口. 1.前面板 在前面板窗口中,可以添加输入控件和显示控件,同时,可以用快捷 ...
- dmidecode输出详解
一.先来看几个用dmidecode查看内存信息的例子. 1.查看内存槽数.那个槽位插了内存,大小是多少 [root@jiangyi01.sqa.zmf /home/ahao.mah] #dmideco ...
- node对称加密(转载)
https://www.cnblogs.com/laogai/p/4664917.html
- 9.简单理解ES分布式
主要知识点: 1.Elasticsearch对复杂分布式机制的透明隐藏特性 2.Elasticsearch的垂直扩容与水平扩容 3.增减或减少节点时的数据rebalance 4.master节 ...
- Codeforces 947E Perpetual Subtraction (线性代数、矩阵对角化、DP)
手动博客搬家: 本文发表于20181212 09:37:21, 原地址https://blog.csdn.net/suncongbo/article/details/84962727 呜啊怎么又是数学 ...
- CSS行高line-height的学习
一.定义和用法 line-height 属性设置行间的距离(行高). 可能的值 normal默认.设置合理的行间距. number设置数字,此数字会与当前的字体尺寸相乘来设置行间距. length设置 ...
- LightOJ - 1231 - Coin Change (I)
先上题目: 1231 - Coin Change (I) PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: ...