一、概述

今天,我们介绍一个比较简单的控件:FloatingActionButton,相信大家一定都听过也在网上见过类似的例子,我们就分为三个部分介绍一下FloatingActionButton的相关知识:

  • Fab的基础使用
  • Fab和其它MD控件的组合
  • 通过自定义FloatingActionButton.Behavior,让Fab根据列表的状态显示和隐藏

二、Fab的基础使用

Fab本质上其实是一个ImageButton,只是它在ImageButton的基础上增加了一些属性,这里介绍几个常用的属性:

展现属性

  • android:srcFab的图片,这其实是ImageView的属性。
  • app:backgroundTintFab的背景色,如果没有设置,那么会取theme中的colorAccent作为背景色。
  • app:fabSizeFab的大小,可选的值包括:
  • mini
  • normal
  • automininormal都预设了固定的大小,而auto属性则会根据屏幕的宽度来设置,在小屏幕上使用mini,而在大屏幕上使用normal,当然我们也可以直接通过layout_width/layout_height来指定。
  • app:elevationFabZ轴方向的距离,也就是深度。
  • app:borderWidthFab边界的宽度,边界的颜色会比背景色稍淡,如下图所示

点击属性

  • app:pressedTranslationZ:点击时FabZ轴的变化值。
  • app:rippleColor:点击时水波纹扩散的颜色。

三、与其它MD控件结合使用

3.1 和AppBarLayout联动

通过给Fab设置app:layout_anchorlayout_anchorGravity两个属性,可以让Fab跟随AppBarLayout移动,并在合适的时候隐藏,下面是我们的布局:

<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="com.demo.lizejun.repotransition.FABActivity"><android.support.design.widget.AppBarLayoutandroid:id="@+id/al_title"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/iv_title"android:src="@drawable/ic_bg"android:layout_width="match_parent"android:scaleType="centerCrop"android:layout_height="150dp"app:layout_scrollFlags="scroll"/></android.support.design.widget.AppBarLayout><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_content"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"/><android.support.design.widget.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@android:drawable/ic_btn_speak_now"android:layout_margin="10dp"app:backgroundTint="@color/colorPrimary"app:layout_anchor="@id/al_title" app:layout_anchorGravity="bottom|end"/>
</android.support.design.widget.CoordinatorLayout>
复制代码

当我们滚动布局的时候,Fab会跟着AppBarLayout先上移,然后消失:

3.2 和BottomSheet联动

AppBarLayout类似,我们也可以通过设置layout_anchor的方法让FabBottomSheet联动:

<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="com.demo.lizejun.repotransition.FABActivity"><android.support.design.widget.AppBarLayoutandroid:id="@+id/al_title"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/iv_title"android:src="@drawable/ic_bg"android:layout_width="match_parent"android:scaleType="centerCrop"android:layout_height="150dp"app:layout_scrollFlags="scroll"/></android.support.design.widget.AppBarLayout><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_content"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"/><include android:id="@+id/bottom_sheet" layout="@layout/layout_bottom_sheet_linear"/><android.support.design.widget.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@android:drawable/ic_btn_speak_now"android:layout_margin="10dp"app:backgroundTint="@color/colorPrimary"app:layout_anchor="@id/bottom_sheet"app:layout_anchorGravity="end"/>
</android.support.design.widget.CoordinatorLayout>
复制代码

这里,我们把layout_anchor设为bottom_sheet

3.3 和Snackbar联动

需要和Snackbar联动时,不需要Fab设置layout_anchor,而是需要在Snackbar展现的时候,第一个参数传入的是CoordinatorLayout

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fab);initView();mRootView = (CoordinatorLayout) findViewById(R.id.cl_root);mFab = (FloatingActionButton) findViewById(R.id.fab);mFab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//这里需要传入CoordinatorLayoutSnackbar.make(mRootView, "点击Fab", Snackbar.LENGTH_LONG).show();}});}
复制代码

下面是展现的效果:

四、Fab根据列表的状态显示或隐藏

Fab的内部,定义了一个Behavior,我们可以通过继承这个Behavior来监听CoordinatorLayout内布局的变化,以实现Fab的显示和隐藏,首先看我们的布局:

<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:id="@+id/cl_root"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.demo.lizejun.repotransition.FABActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_content"android:tag="rv_content"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"/><android.support.design.widget.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@android:drawable/ic_btn_speak_now"android:layout_margin="10dp"android:layout_gravity="bottom|end"app:backgroundTint="@color/colorPrimary"app:layout_behavior="com.demo.lizejun.repotransition.behavior.FabListBehavior"/>
</android.support.design.widget.CoordinatorLayout>
复制代码

我们的根布局是一个CoordinatorLayoutRecyclerViewFab是它的两个子ViewFab位于CoordinatorLayout的右下角,注意到,这里我们给Fab设置了一个自定义的Behavior,正是通过这个behaviorFab可以监听到CoordinatorLayout内布局的滚动情况,下面是我们的Behavior

public class FabListBehavior extends FloatingActionButton.Behavior {private static final int MIN_CHANGED_DISTANCE = 30;public FabListBehavior(Context context, AttributeSet attributeSet) {super(context, attributeSet);}@Overridepublic boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) {return true;}@Overridepublic void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);if (dyConsumed > MIN_CHANGED_DISTANCE) {createValueAnimator(coordinatorLayout, child, false).start();} else if (dyConsumed < -MIN_CHANGED_DISTANCE) {createValueAnimator(coordinatorLayout, child, true).start();}}private Animator createValueAnimator(CoordinatorLayout coordinatorLayout, final View fab, boolean dismiss) {int distanceToDismiss = coordinatorLayout.getBottom() - fab.getBottom() + fab.getHeight();int end = dismiss ? 0 : distanceToDismiss;float start = fab.getTranslationY();ValueAnimator animator = ValueAnimator.ofFloat(start, end);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {fab.setTranslationY((Float) animation.getAnimatedValue());}});return animator;}}
复制代码

这里,我们继承于FloatingActionButton.Behavior来实现自己的Behavior,注意,必须要声明构造函数为FabListBehavior(Context, AttributeSet),并调用super()方法,否则会无法实例化:

  • onStartNestedScroll决定了之后是否需要回调onNestedScroll,这里我们直接返回true
  • onNestedScroll:我们根据dyConsumed的正负值来判断列表滚动的方法,然后通过改变FabtranslationY来让它移入或者移出屏幕。

五、总结

这篇文章,介绍了Fab的基本用法、其它MD控件的联动以及如何自定义FloatingActionButtonBehavior


更多文章,欢迎访问我的 Android 知识梳理系列:

  • Android 知识梳理目录:www.jianshu.com/p/fd82d1899…
  • 个人主页:lizejun.cn
  • 个人知识总结目录:lizejun.cn/categories/

Material Design 控件知识梳理(4) FloatingActionButton相关推荐

  1. Material Design控件使用(二)

    本篇接着之前的Material Design控件总结(一)往下学习support design包下其余控件,如果对Material Design不太熟悉的同学最好把第一篇看完再来看第二篇效果更好 本篇 ...

  2. Material Design控件使用

    本文整合前面四篇的控件,再结合豆瓣读书的API,做了一个搜索书籍和查看书籍信息的Demo. 先上效果图: ##项目依赖库 dependencies {compile fileTree(dir: 'li ...

  3. Material Design控件使用(一)

    最近学习了一下md设计风格和相对应的控件觉得挺棒的,真希望以后能做安卓设计风格的app,只是心有鱼而力不足,虽身为安卓程序员但由于公司设计成本却每天做着iOS风格的app,这感觉真是(此处省略一万字) ...

  4. Material Design控件使用学习 TabLayout+SwipeRefreshlayout

    效果: Tablayout有点类似之前接触过的开源ViewPagerIndicator,将其与viewpager绑定,可实现viewpager的导航功能. SwipeRefreshLayout是官方出 ...

  5. android自动生成cardview,学习使用Material Design控件(三)使用CardView实现卡片效果...

    本文主要介绍CardView的使用,CardView是继承自FrameLayout,使用比较简单,只需要用CardView包含其他View就可以实现卡片效果了. 实现效果如下: 加入依赖库 depen ...

  6. Material Design控件 之 CardView

    1. 简介 CardView 是继承于 FrameLayout,官方说明它是一个带有圆角背景和阴影的Framelayout. 从英文解释它是一个卡片视图,CardView 可以作为一个子布局,也可以作 ...

  7. Material Design控件使用学习 toolbar+drawerlayout+ Snackbar

    效果 1.,导包design包和appcompat-v7 ,设置Theme主题Style为NoActionbar 2.custom_toolbar.xml <?xml version=" ...

  8. Android Material Design 控件常用的属性

    android:fitsSystemWindows="true" 是一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为t ...

  9. flutter初体验之基础控件知识

    在naive开发中,大家对view肯定很熟悉,它代表着所有控件的祖先.在flutter中,也存在这么一个所有控件的祖先---Widget.Widget类是一个抽象类,定义在系统的framework.d ...

  10. flutter笔记4:使用material原生控件开发一个APP

    接着上一篇,我们做一个这样的APP: 开始之前,我发现了一个好玩的东西,每次我们在终端中输入命令: flutter run 终端里会有这个东西: 按照上图所示,我们的进入这个网页看看是个啥: 好高大上 ...

最新文章

  1. 【机器学习】机器学习12个关键经验教训
  2. 微信小程序开发视频教程新鲜出炉
  3. python opencv 峰值信噪比
  4. @import注解使用
  5. VS2017控制台工程日志输出到log文件的同时输出到屏幕
  6. Java判断一组数字是否是等差数列
  7. 从迁移到Java 7的小技巧
  8. el-table使用fixed后,最后一行显示不全;el-table设置fixed后,最后一行被遮挡。
  9. Ubuntu 11.04 二进制包安装 flashget 显示 libexpat.so no...
  10. Microsoft SQL Server 2005 CTP 简体中文版
  11. iPhone 的续航有望加长!749 元的“磁吸充电宝”你会买吗?
  12. AI芯片、框架、语言与知识、量子计算……百度大脑6.0发布
  13. L1-003 个位数统计 (15 point(s))
  14. 编程基本功:如何判断两个线段有重叠?
  15. Qt翻译文件(.ts)的使用
  16. c语言输入abc求方程的根,编写程序,输入系数abc,计算任意二次方根的实根
  17. 无盘服务器chkdsk *: /f)修复命令,让你的电脑运行更快点 使用CHKDSK/F磁盘修复命令...
  18. 软件测试的艺术_读书笔记(一)
  19. 开发APP的费用是多少?
  20. Quantopian 入门系列二 - 流水线 (上)

热门文章

  1. short_open_tag 惹的问题
  2. linux 每日学一点《如何用iptables实现NAT》
  3. oracle 10g 安装完成后,无法登陆EM的解决办法
  4. C语言行列中大小判断,c语言判断两个矩阵是否相等(行列相同的矩阵)
  5. uCOS-II中的任务切换机制
  6. Android 网络管理
  7. Linux acpi off关于Suspend to Disk 问题分析
  8. 判断字符串是否是有效的手机号码
  9. 只包含因子2 3 5的数 (思维和二分)
  10. 小白都能理解的FTRL