自定义CoordinatorLayout的Behavior(2):实现淘宝和QQ ToolBar透明渐变效果

作者 小武站台 关注

2016.02.19 11:34 字数 1244 阅读 3885评论 25喜欢 41

自定义CoordinatorLayout的Behavior实现知乎和简书快速返回效果

每天用淘宝和QQ 会发现淘宝的商品详情页和qq的好友动态页都不约而同的用了工具栏透明渐变效果,淘宝是为了不挡住商品图片,qq设置为了不挡住header image背景,效果感觉还挺好看,老有人问怎么做的。

那我们来分析一下他们的效果

淘宝效果:图片向上滑动的时候,toolbar慢慢的由透明变成完全不透明,向下滑动则相反

淘宝效果

QQ效果:(请自行查看手机,模拟器打死都安装不了,录不了gif) qq的效果类似不过有点不同 下面会分析

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.结束

最后看下我们的效果

toolbar渐变效果

恩 还不错 是不是觉得分分钟就搞定了 当然这里只是简易实现 给大家一个思路,用在实际产品开发中 亲 可能要考虑更多东西哦。

(转载)自定义CoordinatorLayout的Behavior(2):实现淘宝和QQ ToolBar透明渐变效果的更多相关文章

  1. 使用VPN服务器解决公司不能上淘宝的问题

    很多公司为了保证员工的效率,通常采用屏蔽端口的方法屏蔽掉了一些网站,比如淘宝.QQ网页版等,这样做虽然也是公司的迫不得已,但是也有点不人性化,毕竟非上班时间也是上不去此类网站的.前些日子电商大站,抢不 ...

  2. 淘宝内部分享:怎么跳出MySQL的10个大坑

    编者按:淘宝自从2010开始规模使用MySQL,替换了之前商品.交易.用户等原基于IOE方案的核心数据库,目前已部署数千台规模.同时和Oracle, Percona, Mariadb等上游厂商有良好合 ...

  3. 淘宝内部分享:MySQL & MariaDB性能优化

    发表于2015-01-20 16:26| 28875次阅读| 来源mysql.taobao.org| 22 条评论| 作者淘宝数据库团队 MySQL性能优化淘宝数据库 摘要:MySQL是目前使用最多的 ...

  4. 关于CoordinatorLayout与Behavior的一点分析

    Behavior是Android新出的Design库里新增的布局概念.Behavior只有是CoordinatorLayout的直接子View才有意义.可以为任何View添加一个Behavior.Be ...

  5. [置顶] 针对 CoordinatorLayout 及 Behavior 的一次细节较真

    我认真不是为了输赢,我就是认真.– 罗永浩 我一直对 Material Design 很感兴趣,每次在官网上阅读它的相关文档时,我总会有更进一步的体会.当然,Material Design 并不是仅仅 ...

  6. 我的面板我做主 -- 淘宝UWP中自定义Panel的实现

    在Windows10 UWP开发平台上内置的XMAL布局面板包括RelativePanel.StackPanel.Grid.VariableSizedWrapGrid 和 Canvas.在开发淘宝UW ...

  7. Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

    Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...

  8. OAuth2 通用组件源码下载(支持新浪微博、QQ、淘宝)(转载)

    转载地址:http://www.cyqdata.com/download/article-detail-54302 OAuth2 社区通用组件说明:   源码为C#(.NET)写成,目前支持新浪微博. ...

  9. android电子书App、自定义图表、仿腾讯漫画App、仿淘宝优惠券、3D选择容器等源码

    Android精选源码 仿支付宝记账本功能,饼状图:数字键盘 android一款功能完善的电子书应用源码 Android自定义图标库,使用方便,扩展性强 android 3D立体无限旋转容器源码 an ...

随机推荐

  1. Django—链接MySQL

    Djalgo基础配置方法 静态文件配置方法 1 所有的静态文件都放在 static 文件夹下,例如Bootstrap值类的第三方库,通常 static 文件下会创建 css image js 文件,用 ...

  2. scrapy获取重定向之前的url

    通过 response.request.meta['redirect_urls'] 来获取跳转之前的链接

  3. 04-Linux系统编程-第01天(文件IO、阻塞非阻塞)

    03-系统函数 系统编程章节大纲 1 文件I/O 2 文件系统 3 进程 4 进程间通信 5 信号 6 进程间关系 7 守护进程 8 线程 9 线程同步 10 网络基础 11 socket编程 12 ...

  4. 如何彻底卸载系统自带的IE浏览器

    IE浏览器是windows系统上自带的浏览器,有时我们想要用其他的浏览器,例如chrome,卸载IE浏览器,那么应该如何卸载呢?下面就以win7上的IE9为例,告诉大家如何卸载IE浏览器. 方法/步骤 ...

  5. ExpressionTreeVisualizer

    看表达式的工具,这个工具后来微软不更新了,只支持到VS2013 表达式树的语法难度太大,语法和实现难度都大 相关文章 github地址

  6. 洛谷—— P2647 最大收益

    https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,……,n.你可以在这当中任意选择任意多个物品.其中第i个物 ...

  7. binlog

    binlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中: 作用:MySQL的作用类似于Oracle的归档日志,可以用来查看数据库的变 ...

  8. geos库交叉编译生成ARM平台库

    版本号信息: GEOS:geos-3.4.2.tar.bz2(http://trac.osgeo.org/geos/) CPU:ARM 编译器:arm-linux 4.2.2 1.  解压源代码包ge ...

  9. 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题

    I Wanna Become A 24-Point Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 ...

  10. UVA - 10061 How many zero&#39;s and how many digits ?

    n!=x*b^y, 当x为正整数时,最大的y就是n!末尾0的个数了, 把n,b分别拆成素因子相乘的形式: 比如, n=5,b=16 n=5,b=2^4, 非常明显,末尾0的个数为0 10进制时,n!= ...