AppBarLayout 介绍和简单使用_马占柱的博客-程序员秘密

技术标签: app  技术总结  设计  选择器以及界面UI相关  xml  布局  顶部悬浮  

关于Android Design Support Library

​ 在Android 5.0 时出现了 Material Design 。瞬时感觉Android 更加牛B哄哄了,可是其它老版本的Android 怎么办呢?它们也行这么牛B哄哄,走到哪里都耀眼夺目。怎么办呢?Google很贴心的提供了Android Design Support Library,这样就可以支持 Android 2.1 以上的设备了。

​ Android Design Support Library 其实就是一个AAR包,里面包含了navigation drawer view, TextInputEditText,FloatingActionButton, Snackbar, TabLayout, CoordinatorLayout 等。

​ 今天我们介绍的是AppBarLayout这个控件。

AppBarLayout

​ AppBarLayout 继承自LinearLayout,子控件默认为竖直方向显示,可以用它实现Material Design 的Toolbar;它支持滑动手势;它的子控件可以通过在代码里调用setScrollFlags(int)或者在XML里app:layout_scrollFlags来设置它的滑动手势。当然实现这些的前提是它的根布局必须是 CoordinatorLayout。这里的滑动手势可以理解为:当某个可滚动View的滚动手势发生变化时,AppBarLayout内部的子View实现某种动作。

​ AppBarLayout的子控件不仅仅可以设置为Toolbar,也可以包含其他的View。

​ 下面我们具体来看看它的使用方法,我们先看以下的布局:<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            app:title="标题"
            app:layout_scrollFlags="scroll|enterAlways"/>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/nested_scrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/text"/>
    </<android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

可以看到在Toolbar上添加了一个app:layout_scrollFlags,并且把它的值设置为scroll|enterAlways 我们不说为什么我们先看一下实现的效果:我们可以看到当我向上文字时,Toolbar移出屏幕,向下滑动Toolbar进入屏幕。这就是之前的说的滑动手势。

scroll flags

下面我们就看一下scroll flag 都包含哪些:

  1. scroll:设置这个flag之后 Toolbar会滚出屏幕外部,如果不设置这个Toolbar 会固定在顶部不动。

  2. enterAlways:这个flag跟scroll一块使用时,向上滑动时ToolBar移出屏幕,我们向下滑动时Toolbar进入屏幕。上面的图给出的就是scroll|enterAlways这个两个flag的效果。

  3. enterAlwaysCollapsed:enterAlways的附加值。这里涉及到Child View的高度和最小高度,向下滚动时,Child View先向下滚动最小高度值,然后Scrolling View开始滚动,到达边界时,Child View再向下滚动,直至显示完全。我们看一下效果:具体的设置如下:

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
            app:title="标题"
            />
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:minHeight="?android:attr/actionBarSize"
            android:background="@drawable/mt_head"
            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
            />
    </android.support.design.widget.AppBarLayout>
    <android.support.v4.widget.NestedScrollView
        android:id="@+id/nested_scrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/text"/>

    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

首先它会先去找AppBarLayout的直接子View是否设置了minHeight;如果设置了我们的View下拉时,首先AppBarLayout会下拉到我们设定的minHeight,当我们下拉的View完全下拉完毕了,才会把AppBarLayout剩下的拉下来。

4.exitUntilCollapsed:这个跟上面的enterAlwaysCollapsed相反;它也涉及到minHeight,当发生向上滚动事件时,AppLayout向上滚动,直到我们设置的minHeight,然后我们的滑动View才开始滚动。就算我们滑动的view完全上滑完毕,我们的AppBarLayout也会一直保留我们设置的民Height显示在屏幕的上方。这个效果,我们一般会跟CollapsingToolbarLayout一块使用。具体我们看一下代码:

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:background="?attr/colorPrimary"
            android:minHeight="?android:attr/actionBarSize"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:title="标题"
            />
    </android.support.design.widget.AppBarLayout>
    <android.support.v4.widget.NestedScrollView
        android:id="@+id/nested_scrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/text"/>
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

然后我们再看一下显示效果:5.snap:与scroll一起使用时,我们只需要滑动一小段距离,AppBarLayout就会随着我们滑动的View向上滑出屏幕。AppBarLayout会跟随着我们滑动View的滑动,当AppBarLayout滑出屏幕的部分大于显示区域,我们松开手指,AppBarLayout就会自动滑出屏幕;当AppBarLayout滑出屏幕的部分小于显示区域,我们松开手指,AppBarLayout就会自动滑进屏幕。

代码如下:

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|snap"
            app:title="标题"
            />
    </android.support.design.widget.AppBarLayout>
    <android.support.v4.widget.NestedScrollView
        android:id="@+id/nested_scrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/text"/>
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

效果图如下:注意:我们在使用这些flag时,一定要加上scroll,否则不会有效果。我们只需要在xml里设置就OK了,Java代码不需要设置就可以达到上面的效果。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fengyeNom1/article/details/78551307

智能推荐

Ubuntu卸载软件_ubutu卸载应用_月本_诚的博客-程序员秘密

用过使用dpkg软件管理工具得到所有已经安装的软件,如果不清楚软件的全名可以使用grep命令进行查找然后再使用sudo apt-get remove --purge 软件名卸载软件(--purge参数会删除配置文件,删的干净一些)例如:...

Hessian与Webservice的区别_weixin_30487317的博客-程序员秘密

Hessian:hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用了二进制协议,所以它很适合于发送二进制数据,Hessian主要作面向对象的消息通信。Hessian的初衷就是支持动态类型,格式紧凑,跨语言。Hessian是使用自己的序列化机制实现的编组和反...

mysql binlog_do_db参数设置的坑_mengtianyalll的博客-程序员秘密

现象在配置文件中想当然地配置成binlog_do_db=test,xx,jj,以为是三个库。结果无论什么操作都没有binlog产生原因MySQL内部将“test,xx,jj”当成一个数据库了,结果因为我们没有这个db,自然就啥binlog都没写入了。处理方法正确的配置方法应该是这样binlog_do_db=testbinlog_do_db=x

Python IDE_清_澈的博客-程序员秘密

本文为大家推荐几款款不错的 Python IDE(集成开发环境),比较推荐 PyCharm,当然你可以根据自己的喜好来选择适合自己的 Python IDE。PyCharmPyCharm 是由 JetBrains 打造的一款 Python IDE。PyCharm 具备一般 Python IDE 的功能,比如:调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试

Bentley.CivilStorm/SewerGEMS/StormCAD/GeomCaliper_cloudworx cad_software2017的博客-程序员秘密

Bentley.CivilStorm.CONNECT.Edition.Update1.v10.01.00.70 1CD Bentley.SewerGEMS.CONNECT.Edition.Update1.v10.01.00.70 1CDBentley产品:Bentley.Architecture.v8i.XM.v8.11.05.46 1CD(提供了直觉化的使用者介面,强

html5 2d小游戏,GitHub - pepsin/cax: HTML5 Canvas 2D Rendering Engine - 小程序、小游戏以及 Web 通用 Canvas 渲染引擎..._我叫小妖去巡山的博客-程序员秘密

English | 简体中文Cax HTML5 Canvas 2D Rendering EngineFeaturesSimple API, Lightweight and High performanceSupport PC and Mobile Canvas 2D Rendering and Mouse and Touch EventSupport event of element and el...

随便推点

细说分布式数据库的过去、现在与未来_分布式大数据处理算法与系统的未来_weixin_42526793的博客-程序员秘密

主题简介:分布式数据库的历史和现状TiDB架构和特点分布式数据库未来趋势 随着大数据这个概念的兴起以及真实需求在各个行业的落地,很多人都热衷于讨论分布式数据库,今天就这个话题,主要分为三部分:第一部分讲一下分布式数据库的过去和现状,希望大家能对这个领域有一个全面的了解;第二部分讲一下TiDB的架构以及最近的一些进展;最后结合我们开发TiDB过程中的一些思考讲一下分布式数据库未来可能的趋势。 一、分...

Microsof Office SharePoint 2007 工作流开发环境搭建_maseccc的博客-程序员秘密

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhenghang.blog.51cto.com/310686/69696 一.安装必要的软件以及插件         1.Microsoft .NET Framework 3.0         下载地址http://www.microsoft.com/download

Shell中字符串拼接的方法_阿_波_的博客-程序员秘密

我们可以看到在系统中,字符串的拼接方法为(.bash_profile文件):PATH=$PATH:$HOME/.local/bin:$HOME/bin以及《Linux命令行与Shell脚本编程大全中提到的》var=${var1}${var2}#!/bin/bashvar1=&quot;/HOME&quot;var2=&quot;/use1&quot;var3=$var1$var2var4=${var1}$...

All In One - 第4章 通信与网络安全_vlan hopping_念思伊人的博客-程序员秘密

本章解决的问题:1.什么是通信?什么是网络?通信和网络有什么区别和联系?通信标准、网络协议是什么,有哪些分类?为什么要使用通信标标准,有什么好处?2.由网络构成的网络模型又有哪些?OSI模型和TCP/IP模型的区别和联系?3.OSI模型的每一层的具体协议有哪些,功能?具体协议对应的安全功能的变种协议是哪些?4.无线通信协议的具体协议有哪些?功能,适用场景是什么?具体对应的又安全功能的变种协议是哪些? ...

Last login: Wed Aug 24 17:23:14 2016 from wr702n.mshome.net_conic9833的博客-程序员秘密

今天,为了测试 RHEL 7(使用systemctl) 下双网卡绑定相关问题,在 OracleVirtualBox最小安装了centos 7。半天使用下来使用 ssh 连接,突然看到了一行:Last login: W...

Unity__对XML文件的操作(生成,读取,修改,追加)_qq_41056203的博客-程序员秘密

/// &amp;lt;summary&amp;gt; /// 生成XML文件 /// &amp;lt;/summary&amp;gt; void CreateXML() { string path = Application.dataPath + &quot;/data2.xml&quot;; if (!File.Exists(path)) { ...