自定义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. mount 命令总结

    配置CnetOS 7.4 本地yum源,记录下遇到的ISO镜像挂载问题,使用 blkid 命令可以查看设备的UUID.Label.文件系统类型(iso镜像文件系统类型iso9660) [root@lo ...

  2. 用Python来实现斐波那契数列.

    1).递归 def fib_recur(n): assert n >= 0, "n > 0" if n <= 1: return n return fib_rec ...

  3. matlab学习checkbox使用

    添加radiobutton1和checkbox2控件以及两个edittextbox控件 %得到控件的值var=get(handles.kj2,'value');%将数值显示到文本框中,将得到的数值转换 ...

  4. javaee IO流复制的方法

    package Zjshuchu; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileN ...

  5. hadoop spark 总结

    yarn  由,资源管理器rm,应用管理器am appMaster,节点管理器nm 组成! 图侵删 yarn 的设计,是为了代替hadoop 1.x的jobtracker 集中式一对多的资源管理「资源 ...

  6. Linux删除重复内容命令uniq笔记

    针对文本文件,有时候我们需要删除其中重复的行.或者统计重复行的总次数,这时候可以采用Linux系统下的uniq命令实现相应的功能. 语法格式:uniq [-ic] 常用参数说明: -i 忽略大小写 - ...

  7. eas之添加表格列宽自动调整设置

    设置表格整体宽度自动调整为所在panel的宽度 KDTable table=new KDTable(); table. setAutoResize (boolean); 注意:该功能在冻结功能启用后, ...

  8. DOM学习之充实文档内容

    HTML代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...

  9. node对称加密(转载)

    https://www.cnblogs.com/laogai/p/4664917.html

  10. java链接linux服务器,命令操作

    1.本地读取linux文件,即在Windows上链接外部linux package com.common.utils; import java.io.BufferedReader; import ja ...