CoordinatorLayout常常与AppBarLayout和CollapsingToolbarLayout一起使用,用于打造各种炫酷效果的顶部栏。之前写过一篇Android 实现酷炫的顶部栏,不过要注意的是这次我们用到Androidx,原因是Google 发布了 Android support library 28,同时也发布了 androidx 1.0.0 第一个正式版本,然后支持库的 “28.0.0” 将会是最后一次更新,之后的更新都会迁移到 Androidx 中,所以我们这里也使用Androidx 了。
一、迁移到 Androidx
我们顺便讲一下迁移到 Androidx的迁移步骤,首先在 gradle.properties 文件中添加

# 表示使用 androidx
android.useAndroidX=true
# 表示将第三方库迁移到 androidx
android.enableJetifier=true

迁移后如果会报错,需要 Flie -> Invalidate Caches /Restart 一下就可以了。
具体可以参考迁移到 AndroidX

二、按照惯例,我们先看看效果图:

从效果图来看,当设置了layout_behavior的控件响应起了CollapsingToolbarLayout中的layout_scrollFlags事件时,ImageView会有视差效果的向上滚动移除屏幕,当开始折叠时,我们代码上来设置 toolbar 背景透明图。

三、我们先来看看布局文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><!--第一部分:伸缩工具栏--><com.google.android.material.appbar.AppBarLayoutandroid:id="@+id/app_bar"android:layout_width="match_parent"android:layout_height="wrap_content"app:elevation="0dp"><com.google.android.material.appbar.CollapsingToolbarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"app:layout_scrollFlags="scroll|exitUntilCollapsed"app:title=""app:titleEnabled="false"><ImageViewandroid:layout_width="match_parent"android:layout_height="220dp"android:background="@mipmap/icon_bg"android:scaleType="fitXY" /><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="46dp"android:background="@drawable/bg_toolbar_gardient"android:minHeight="46dp"app:layout_collapseMode="pin"app:navigationIcon="@mipmap/icon_common_back"app:title=""><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="个人主页"android:textColor="@android:color/white"android:textSize="18dp"android:textStyle="bold" /></androidx.appcompat.widget.Toolbar></com.google.android.material.appbar.CollapsingToolbarLayout></com.google.android.material.appbar.AppBarLayout><!--第二部分:主要内容--><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior" /></androidx.coordinatorlayout.widget.CoordinatorLayout>

(1)我们在CollapsingToolbarLayout中设置了一个ImageView和一个Toolbar,并将这个CollapsingToolbarLayout作为一个整体放在AppBarLayout中;
(2)在CollapsingToolbarLayout中,我们设置了app:layout_scrollFlags=“scroll|enterAlwaysCollapsed”,它的值还包括:

  • scroll - 想滚动就必须设置这个,也就是说值设为scroll的View会跟随滚动事件一起滚动
  • enterAlways - 值设为enterAlways的View,当RecyclerView往下滚动时,该View会直接往下滚动
  • exitUntilCollapsed - 值设为exitUntilCollapsed的View,当这个View要往上逐渐“消逝”时,会一直往上滑动,直到剩下的的高度达到它的最小高度后,再响应RecyclerView的内部滑动事件。
  • enterAlwaysCollapsed - 当值设为enterAlwaysCollapsed 的View已经设置minHeight属性又使用此标志时,这个View只能以最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度

(3)在Toolbar控件中,我们设置了app:layout_collapseMode=“pin”,layout_collapseMode (折叠模式) - 有两个值:

  • pin - 设置为这个模式时,当CollapsingToolbarLayout完全收缩后,Toolbar还可以保留在屏幕上
  • parallax - 设置为这个模式时,在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,实现视差滚动效果,通常和layout_collapseParallaxMultiplier(设置视差因子)搭配使用

四、我们先来看看代码

package per.juan.coordinatorlayoutdome;import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.appbar.AppBarLayout;
import java.lang.reflect.Field;public class MainActivity extends AppCompatActivity {private Toolbar toolbar;private AppBarLayout app_bar;private RecyclerView mRecyclerView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initToolBar();initView();}private void initView() {mRecyclerView = findViewById(R.id.recyclerview);toolbar = findViewById(R.id.toolbar);app_bar = findViewById(R.id.app_bar);final int alphaMaxOffset = dpToPx(150);toolbar.getBackground().setAlpha(0);app_bar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {@Overridepublic void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {// 设置 toolbar 背景if (verticalOffset > -alphaMaxOffset) {toolbar.getBackground().setAlpha(255 * -verticalOffset / alphaMaxOffset);} else {toolbar.getBackground().setAlpha(255);}}});mRecyclerView.setLayoutManager(new LinearLayoutManager(this));mRecyclerView.setAdapter(new ContentAdapter());}protected void initToolBar() {try {Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);if (toolbar != null) {// 沉浸模式int statusBarHeight = getStatusBarHeight();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {openAndroidLStyle();toolbar.setPadding(0, statusBarHeight, 0, 0);toolbar.getLayoutParams().height = dpToPx(46) + statusBarHeight;}}} catch (Exception e) {e.printStackTrace();}}/*** 开启沉浸式模式支持*/public void openAndroidLStyle() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = getWindow();window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(Color.TRANSPARENT);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}}/*** 获取状态栏高度*/public int getStatusBarHeight() {try {Class<?> c = Class.forName("com.android.internal.R$dimen");Object obj = c.newInstance();Field field = c.getField("status_bar_height");int x = Integer.parseInt(field.get(obj).toString());return getResources().getDimensionPixelSize(x);} catch (Exception e) {e.printStackTrace();}return 0;}/*** dp转换为px*/public static int dpToPx(float dp) {return (int) (dp * Resources.getSystem().getDisplayMetrics().density + 0.5f);}private class ContentAdapter extends RecyclerView.Adapter<ContentAdapter.ContentHolder> {@Overridepublic ContentAdapter.ContentHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new ContentHolder(LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_list_item_1, parent, false));}@Overridepublic void onBindViewHolder(ContentAdapter.ContentHolder holder, int position) {holder.itemTv.setText("item");}@Overridepublic int getItemCount() {return 35;}class ContentHolder extends RecyclerView.ViewHolder {private TextView itemTv;public ContentHolder(View itemView) {super(itemView);itemTv = (TextView) itemView.findViewById(android.R.id.text1);}}}
}

(1)这里我们需要开启沉浸式模式的支持;
(2)通过AppBarLayout.addOnOffsetChangedListener来监听折叠过程中AppBarLayout垂直方向上的偏移量的改变,我们代码上来设置 toolbar 背景透明图。

好了,本篇文章就这样啦,存在总结不到位的地方还望指导,感谢 _
源码下载

Android CoordinatorLayout打造酷炫的顶部栏相关推荐

  1. 玩转AppBarLayout,更酷炫的顶部栏

    转: http://www.jianshu.com/p/d159f0176576 上一篇文章[<CoordinateLayout的使用如此简单 >]上一篇文章<CoordinateL ...

  2. Android矢量图动画特效,Android使用SVG矢量图打造酷炫动画效果

    一个真正Android使用SVG矢量图打造酷炫动效往往让人虎躯一震,话不多说,咱们先看看效果: 这个效果我们需要考虑以下几个问题: 1. 这是图片还是文字: 2. 如果是图片该如何拿到图形的边沿线坐标 ...

  3. Vue.js 打造酷炫的可视化数据大屏

    可视化技术与 Vue 介绍 实验介绍 在本节实验中,将对可视化技术的应用场景.发展历程进行介绍,让大家对可视化技术有一个基础的概念.随后将介绍如今流行的可视化框架与其之间的优缺点对比.最后介绍 Vue ...

  4. unity 彩带粒子_Unity粒子系统插件,打造酷炫魔幻特效

    原标题:Unity粒子系统插件,打造酷炫魔幻特效 儿时的你是否也会幻想自己拥有超能力,能召唤各种水光火电或是操纵世间万物?现在的我们已经不需要幻想了,因为游戏就能满足所有的这些或天真或童趣的想法.而作 ...

  5. Android使用SVG矢量图打造酷炫动效!

    一个真正酷炫的动效往往让人虎躯一震,话不多说,咱们先瞅瞅效果: 如果你想看 GAStudio Github主页,请戳这里: 如果你想看 GAStudio更多技术文章,请戳这里: QQ技术交流群:277 ...

  6. android 酷炫启动页,RxJava实践之打造酷炫启动页

    原文发布于我的博客Android猿 之前注意到coding APP启动页很是酷炫,今天我们使用RxJava和属性动画模仿实现其效果. ezgif.com-video-to-gif(2).gif 一.新 ...

  7. java水果爆炸动画_5分钟快速实现Android爆炸破碎酷炫动画特效的示例

    这个破碎动画,是一种类似小米系统删除应用时的爆炸破碎效果的动画. 效果图展示 先来看下是怎样的动效,要是感觉不是理想的学习目标,就跳过,避免浪费大家的时间.�� 一行代码即可调用该动画 new Exp ...

  8. android开源的酷炫的交互动画和视觉效果:Interactive-animation

    描述:收集android上开源的酷炫的交互动画和视觉效果. 1.交互篇 2.视觉篇 交互篇 1.SlidingUpPanelLayout 项目介绍:他的库提供了一种简单的方式来添加一个可拖动滑动面板( ...

  9. 纯CSS打造酷炫霓虹灯loading bar特效

    本篇文章我们要来实现一个酷炫的霓虹灯特效的加载条loading bar的特效,如下图所示: 可以看到,这个loading bar的周围有霓虹灯一样的朦胧美感,而且底部还有一个倒影,这是怎么做到的呢? ...

最新文章

  1. 如何自行绕制所需要的2.2uH的电感?
  2. 感知算法论文(四):Mask Scoring R-CNN (2019)译文
  3. php开发支付宝支付密码忘记了怎么办_密码箱忘记密码怎么办?密码箱解锁方法大全...
  4. 根据概率分布随机采样python_PR Sampling Ⅱ:马尔可夫链蒙特卡洛 MCMC及python实现...
  5. 简单的跑马灯效果(轮播图)
  6. mysql用户画像表设计_用户画像:计算用户偏好标签及数据指标与表结构设计
  7. 仓储扫描管理系统服务器价格,仓储条码管理系统解决方案报告书.doc
  8. JAVA自动生成前缀加日期的编码
  9. 云编程那些事3 - Yahoo的烟斗
  10. PhD Debate-11 预告 | 矛与盾的对决——神经网络后门攻防
  11. HTML5期末大作业:京东网站设计——仿京东(7页) 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  12. 宝德自强PT620Z1
  13. 基于python的音乐数据分析_基于Python的亚马逊音乐产品评论分析
  14. 手机功能测试抓log方式(四种)
  15. 高效算法,B*寻路算法,python版,思维优化(1)
  16. 杭州职业技术学院计算机教研室主任,课题名称杭州地区农村小学教师运用现代教育技术现状调查和对策的研究.doc...
  17. 《设计模式》之 3 装饰者模式
  18. 全国大学生计算机等级考试计算机二级python真题复习链接
  19. 2017年电气报价软件排名!评分最高的是它
  20. 【微信篇】微信手机号存储问题

热门文章

  1. GC+堆排+Tomcat+算法题,深度好文
  2. Android adb查看系统时间
  3. win10找不到wifi网络_笔记本无线网络找不到无线网络
  4. 那些激情排队的果粉们
  5. 基于Hadoop+Java+MySQL的歌曲推荐管理系统设计与实现
  6. 数学系学生要看的十部影视
  7. vscode格式化react代码
  8. 点击按钮显示模态框,只显示模态框背景
  9. 闲鱼项目是真的吗?新手实操赚钱攻略手册!
  10. JS-递归函数:什么是递归