欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 5.0中CoordinatorLayout的使用技巧

程序员文章站 2024-03-04 18:54:45
coordinatorlayout 实现了多种material design中提到的滚动效果。目前这个框架提供了几种不用写动画代码就能工作的方法,这些效果包括: *...

coordinatorlayout 实现了多种material design中提到的滚动效果。目前这个框架提供了几种不用写动画代码就能工作的方法,这些效果包括:

*让浮动操作按钮上下滑动,为snackbar留出空间。
*扩展或者缩小toolbar或者头部,让主内容区域有更多的空间。
*控制哪个view应该扩展还是收缩,以及其显示大小比例,包括视差滚动效果动画。

浮动操作按钮与snackbar

coordinatorlayout可以用来配合浮动操作按钮的 layout_anchor 和 layout_gravity属性创造出浮动效果。
当snackbar在显示的时候,往往出现在屏幕的底部。为了给snackbar留出空间,浮动操作按钮需要向上移动。

Android 5.0中CoordinatorLayout的使用技巧

只要使用coordinatorlayout作为基本布局,将自动产生向上移动的动画。浮动操作按钮有一个 默认的 behavior来检测snackbar的添加并让按钮在snackbar之上呈现上移与snackbar等高的动画。

<android.support.design.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">

 <android.support.v7.widget.recyclerview
  android:id="@+id/rvtodolist"
  android:layout_width="match_parent"
  android:background="#9d9d9d"
  android:layout_height="match_parent"/>
 <android.support.design.widget.floatingactionbutton
  android:id="@+id/fab"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="end|bottom"
  android:layout_margin="16dp"
  app:layout_anchor="@id/rvtodolist"
  app:layout_anchorgravity="bottom|right|end"/>
 <!--app:layout_anchor:意思是fab浮动按钮显示在哪个布局区域。且设置当前锚点的位置
 app:layout_anchorgravity:意思fab浮动按钮在这个布局区域的具体位置。两个属性共同作用才是的fab 浮动按钮也能折叠消失,出现。
 -->

</android.support.design.widget.coordinatorlayout>

protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  findviewbyid(r.id.fab).setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    snackbar.make(v, "test", snackbar.length_long)
      .setaction("cancel", new view.onclicklistener() {
       @override
       public void onclick(view v) {
        //这里的单击事件代表点击消除action后的响应事件
        toast.maketext(mainactivity.this,"asdasd",toast.length_short).show();
       }
      }).show();
   }
  });
 }

toolbar的扩展与收缩

首先需要确保你不是使用已经过时的actionbar,使用toolbar作为actionbar。同样,这里也需要coordinatorlayout作为主布局容器。
我们必须使用一个容器布局: appbarlayout 来让toolbar响应滚动事件。响应滚动事件

<android.support.design.widget.appbarlayout
  android:id="@+id/appbar"
  android:layout_width="match_parent"
  android:layout_height="@dimen/detail_backdrop_height"
  android:theme="@style/themeoverlay.appcompat.dark.actionbar"
  android:fitssystemwindows="true">

 <android.support.v7.widget.toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionbarsize"
    app:popuptheme="@style/themeoverlay.appcompat.light" />

 </android.support.design.widget.appbarlayout>

然后,我们需要定义appbarlayout与滚动视图之间的联系。在recyclerview或者任意支持嵌套滚动的view比如nestedscrollview上添加app:layout_behavior。support library包含了一个特殊的字符串资源@string/appbar_scrolling_view_behavior,它和appbarlayout.scrollingviewbehavior相匹配,用来通知appbarlayout 这个特殊的view何时发生了滚动事件,这个behavior需要设置在触发事件(滚动)的view之上。注意:根据官方的谷歌文档,appbarlayout目前必须是第一个嵌套在coordinatorlayout里面的子view。

<android.support.v7.widget.recyclerview
  android:id="@+id/rvtodolist"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:layout_behavior="@string/appbar_scrolling_view_behavior">

appbarlayout里面定义的view只要设置了app:layout_scrollflags属性,就可以在recyclerview滚动事件发生的时候被触发:当coordinatorlayout发现recyclerview中定义了这个属性,它会搜索自己所包含的其他view,看看是否有view与这个behavior相关联。appbarlayout.scrollingviewbehavior描述了recyclerview与appbarlayout之间的依赖关系。recyclerview的任意滚动事件都将触发appbarlayout或者appbarlayout里面view的改变。

<android.support.design.widget.appbarlayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:fitssystemwindows="true"
  android:theme="@style/themeoverlay.appcompat.dark.actionbar">

   <android.support.v7.widget.toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionbarsize"
    app:layout_scrollflags="scroll|enteralways"/>

 </android.support.design.widget.appbarlayout>

app:layout_scrollflags是一个非常重要的属性,它里边的取值主要有五种,下面我分别来解释:

1.scroll 表示collapsingtoolbarlayout可以滚动(不设置的话头部的imageview将不能折叠),如果想将所有的view能滚动出屏幕,必须设置个flag,若没有设置flag的view,则会被固定在屏幕顶部
2.enteralways 表示底部的滚动控件只要向下滚动,头部就显示出来,设置这个flag时,向下的滚动都会导致该view变为可见。当scrollview往下滚动时,该view会直接往下滚动。而不用考虑scrollview是否在滚动。
3.enteralwayscollapsed 表示当底部滚动控件滚动见顶时,头部显示出来,在scrollview往上滑动时,首先是view把滑动事件“夺走”,由view去执行滑动,直到滑动最小高度后,把这个滑动事件“还”回去,让scrollview内部去上滑。
4.exituntilcollapsed 表示头部折叠到最小高度时(toolbar的高度),就不再折叠,是enteralways的附加选项,一般跟enteralways一起使用,它是指,view在往下“出现”的时候,首先是enteralways效果,当view的高度达到最小高度时,view就暂时不去往下滚动,直到scrollview滑动到顶部不再滑动时,view再继续往下滑动,直到滑到view的顶部结束。
5.snap 表示在滑动过程中如果停止滑动,则头部会就近折叠(要么恢复原状,要么折叠成一个toolbar)
记住,要把带有scroll flag的view放在前面,这样收回的view才能让正常退出,而固定的view继续留在顶部。

Android 5.0中CoordinatorLayout的使用技巧

制造折叠效果

如果想制造toolbar的折叠效果,我们必须把toolbar放在collapsingtoolbarlayout中:

<android.support.design.widget.coordinatorlayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:id="@+id/main_content"
 tools:context="wxt.coordinatorlayout.appbarlayout">
 <android.support.design.widget.appbarlayout
  android:id="@+id/appbar"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  >
  <android.support.design.widget.collapsingtoolbarlayout
   android:id="@+id/collapsing_toolbar"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:fitssystemwindows="true"
   app:contentscrim="?attr/colorprimary"
   app:expandedtitlemarginend="64dp"
   app:expandedtitlemarginstart="48dp"
   app:layout_scrollflags="scroll|exituntilcollapsed">

   <android.support.v7.widget.toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionbarsize"
    app:layout_scrollflags="scroll|enteralways"></android.support.v7.widget.toolbar>
  </android.support.design.widget.collapsingtoolbarlayout>
 </android.support.design.widget.appbarlayout>
 <android.support.v4.widget.nestedscrollview
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  app:layout_behavior="@string/appbar_scrolling_view_behavior">

  <textview
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="aaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\n" />
 </android.support.v4.widget.nestedscrollview>

现在效果就成了:

Android 5.0中CoordinatorLayout的使用技巧

通常,我们我们都是设置toolbar的title,而现在,我们需要把title设置在collapsingtoolbarlayout上,而不是toolbar。

collapsingtoolbarlayout collapsingtoolbar =(collapsingtoolbarlayout) findviewbyid(r.id.collapsing_toolbar);
collapsingtoolbar.settitle("title");

制造视差效果collapsingtoolbarlayout

collapsingtoolbarlayout还能让我们做出更高级的动画,比如在里面放一个imageview,然后在它折叠的时候渐渐淡出。同时在用户滚动的时候title的高度也会随着改变。

Android 5.0中CoordinatorLayout的使用技巧

collapsingtoolbarlayout作用是提供了一个可以折叠的toolbar,它继承至framelayout,给它设置layout_scrollflags,它可以控制包含在collapsingtoolbarlayout中的控件(如:imageview、toolbar)在响应layout_behavior事件时作出相应的scrollflags滚动事件(移除屏幕或固定在屏幕顶端)。

使用collapsingtoolbarlayout:

<android.support.design.widget.appbarlayout
  android:layout_width="match_parent"
  android:layout_height="256dp"
  android:fitssystemwindows="true">
  <android.support.design.widget.collapsingtoolbarlayout
   android:id="@+id/collapsing_toolbar_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   app:contentscrim="#30469b"
   app:expandedtitlemarginstart="48dp"
   app:layout_scrollflags="scroll|exituntilcollapsed">
   <imageview
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaletype="centercrop"
    android:src="@mipmap/bg"
    app:layout_collapsemode="parallax"
    app:layout_collapseparallaxmultiplier="0.7" />
   <android.support.v7.widget.toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionbarsize"
    app:layout_collapsemode="pin" />
  </android.support.design.widget.collapsingtoolbarlayout>
 </android.support.design.widget.appbarlayout>

我们在collapsingtoolbarlayout中设置了一个imageview和一个toolbar。并把这个collapsingtoolbarlayout放到appbarlayout中作为一个整体。

1、在collapsingtoolbarlayout中:

其中还设置了一些属性,简要说明一下:

contentscrim - 设置当完全collapsingtoolbarlayout折叠(收缩)后的背景颜色。

expandedtitlemarginstart - 设置扩张时候(还没有收缩时)title向左填充的距离。

2、在imageview控件中:

我们设置了:

layout_collapsemode (折叠模式) - 有两个值:

pin - 设置为这个模式时,当collapsingtoolbarlayout完全收缩后,toolbar还可以保留在屏幕上。

parallax - 设置为这个模式时,在内容滚动时,collapsingtoolbarlayout中的view(比如imageview)也可以同时滚动,实现视差滚动效果,通常和layout_collapseparallaxmultiplier(设置视差因子)搭配使用。

layout_collapseparallaxmultiplier(视差因子) - 设置视差滚动因子,值为:0~1。

3、在toolbar控件中:

我们设置了layout_collapsemode(折叠模式):为pin。

综上分析:当设置了layout_behavior的控件响应起了collapsingtoolbarlayout中的layout_scrollflags事件时,imageview会有视差效果的向上滚动移除屏幕,当开始折叠时collapsingtoolbarlayout的背景色(也就是toolbar的背景色)就会变为我们设置好的背景色,toolbar也一直会固定在最顶端。

【注】:使用collapsingtoolbarlayout时必须把title设置到collapsingtoolbarlayout上,设置到toolbar上不会显示。即:

mcollapsingtoolbarlayout.settitle(” “);

该变title的字体颜色:

扩张时候的title颜色:mcollapsingtoolbarlayout.setexpandedtitlecolor();

收缩后在toolbar上显示时的title的颜色:mcollapsingtoolbarlayout.setcollapsedtitletextcolor();

这个颜色的过度变化其实collapsingtoolbarlayout已经帮我们做好,它会自动的过度,比如我们把收缩后的title颜色设为绿色。

coordinatorlayout与collapsingtoolbarlayout:
collapsingtoolbarlayout的作用提供了一个可以折叠的toolbar,对toolbar进行再次包装的viewgroup,继承fragmentlayout,它需要放在appbarlayout布局里面,并且作为appbarlayout的直接子view。collapsingtoolbarlayout主要包括几个功能:
①:折叠title(collapsing title):当布局内容全部显示出来时,title是最大的,但是随着view逐步移出屏幕顶部,title变得越来越小。你可以通过collapsingtoolbarlayout调用settitle函数来设置title。

②:内容纱布(content scrim):根据滚动的位置是否到达一个阀值,来决定是否对view“盖上纱布”。可以通过setcontentscrim(drawable)来设置纱布的图片.toolbar被折叠到顶部固定时候的背景,你可以调用setcontentscrim(drawable)方法改变背景或者 在属性中使用 app:contentscrim=”?attr/colorprimary”来改变背景。

③:状态栏纱布(status bar scrim):根据滚动位置是否到达一个阀值决定是否对状态栏“盖上纱布”,你可以通过setstatusbarscrim(drawable)来设置纱布图片,调用方法setstatusbarscrim(,l)设置状态栏的背景,但是只能在lollipop设备上面有作用。这个只能在android5.0以上系统有效果。

④ollapsemode :子视图的折叠模式,在子视图设置,有两种,想要明确的看到效果可以给toolbar设置一个背景颜色
(1)“pin”:固定模式,在折叠的时候最后固定在顶端;
(2)“parallax”:视差模式,在折叠的时候会有个视差折叠的效果。我们可以在布局中使用属性app:layout_collapsemode=”parallax”来改变:

(1):将子view位置固定(pinned position children):子view可以选择是否在全局空间上固定位置,这对于toolbar来说非常有用,因为当布局在移动时,可以将toolbar固定位置而不受移动的影响。 将app:layout_collapsemode设为pin。

(2):视差滚动子view(parallax scrolling children):子view可以选择在当前的布局当时是否以“视差”的方式来跟随滚动。(:其实就是让这个view的滚动的速度比其他正常滚动的view速度稍微慢一点)。将布局参数app:layout_collapsemode设为parallax,值的范围[0.0,1.0],值越大视察越大。

app:layout_collapsemode=”parallax”表示imageview的折叠和collapsingtoolbarlayout的折叠不同步,那么这个不同步到底是怎样一个不同步法呢?还有另外一个参数来设置不同步的参数,如下:
app:layout_collapseparallaxmultiplier=”0.5”表示视觉乘数,该数值的取值为0~1,数值越大,视觉差越大(如果这里的值为0,则在头部折叠的过程中,imageview的顶部在慢慢隐藏,底部不动,如果这里的值为1,imageview的顶部不懂,底部慢慢隐藏,如果这里的取值为0~1之间,则在折叠的过程中,imageview的顶部和底部都会隐藏,但是头部和底部隐藏的快慢是不一样的,具体速度和视觉乘数有关)
app:layout_collapsemode这个属性还有一个取值,是pin,该属性表示当折叠完成时将该控件放在页面的头部.

最终的代码:

<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"
 tools:context=".mainactivity">
 <android.support.design.widget.appbarlayout
  android:layout_width="match_parent"
  android:layout_height="256dp"
  android:fitssystemwindows="true">
  <android.support.design.widget.collapsingtoolbarlayout
   android:id="@+id/collapsing_toolbar_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   app:contentscrim="#30469b"
   app:expandedtitlemarginstart="48dp"   app:expandedtitletextappearance="@style/textappearance.appcompat.title"   app:collapsedtitletextappearance="@style/textappearance.appcompat.title"
   app:layout_scrollflags="scroll|exituntilcollapsed">
   <imageview
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaletype="centercrop"
    android:src="@mipmap/bg"
    app:layout_collapsemode="parallax"
    app:layout_collapseparallaxmultiplier="0.7" />
   <android.support.v7.widget.toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionbarsize"
    app:layout_collapsemode="pin" />
  </android.support.design.widget.collapsingtoolbarlayout>
 </android.support.design.widget.appbarlayout>
 <linearlayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  app:layout_behavior="@string/appbar_scrolling_view_behavior">
  <android.support.v7.widget.recyclerview
   android:id="@+id/recyclerview"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:scrollbars="none" />
 </linearlayout>
</android.support.design.widget.coordinatorlayout>

java代码

toolbar mtoolbar = (toolbar) findviewbyid(r.id.toolbar);
  setsupportactionbar(mtoolbar);
  getsupportactionbar().setdisplayhomeasupenabled(true);
  mtoolbar.setnavigationonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    onbackpressed();
   }
  });
  //使用collapsingtoolbarlayout必须把title设置到collapsingtoolbarlayout上,设置到toolbar上则不会显示
  collapsingtoolbarlayout mcollapsingtoolbarlayout = (collapsingtoolbarlayout) findviewbyid(r.id.collapsing_toolbar_layout);
  mcollapsingtoolbarlayout.settitle("collapsingtoolbarlayout");
  //通过collapsingtoolbarlayout修改字体颜色
  mcollapsingtoolbarlayout.setexpandedtitlecolor(color.white);//设置还没收缩时状态下字体颜色
  mcollapsingtoolbarlayout.setcollapsedtitletextcolor(color.green);//设置收缩后toolbar上字体的颜色

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。