Material Design 控件知识梳理(4) FloatingActionButton
一、概述
今天,我们介绍一个比较简单的控件:FloatingActionButton
,相信大家一定都听过也在网上见过类似的例子,我们就分为三个部分介绍一下FloatingActionButton
的相关知识:
Fab
的基础使用Fab
和其它MD
控件的组合- 通过自定义
FloatingActionButton.Behavior
,让Fab
根据列表的状态显示和隐藏
二、Fab
的基础使用
Fab
本质上其实是一个ImageButton
,只是它在ImageButton
的基础上增加了一些属性,这里介绍几个常用的属性:
展现属性
android:src
:Fab
的图片,这其实是ImageView
的属性。app:backgroundTint
:Fab
的背景色,如果没有设置,那么会取theme
中的colorAccent
作为背景色。app:fabSize
:Fab
的大小,可选的值包括:mini
:normal
auto
:mini
和normal
都预设了固定的大小,而auto
属性则会根据屏幕的宽度来设置,在小屏幕上使用mini
,而在大屏幕上使用normal
,当然我们也可以直接通过layout_width/layout_height
来指定。app:elevation
:Fab
在Z
轴方向的距离,也就是深度。app:borderWidth
:Fab
边界的宽度,边界的颜色会比背景色稍淡,如下图所示
点击属性
app:pressedTranslationZ
:点击时Fab
在Z
轴的变化值。app:rippleColor
:点击时水波纹扩散的颜色。
三、与其它MD
控件结合使用
3.1 和AppBarLayout
联动
通过给Fab
设置app:layout_anchor
和layout_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
的方法让Fab
和BottomSheet
联动:
<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>
复制代码
我们的根布局是一个CoordinatorLayout
,RecyclerView
和Fab
是它的两个子View
,Fab
位于CoordinatorLayout
的右下角,注意到,这里我们给Fab
设置了一个自定义的Behavior
,正是通过这个behavior
,Fab
可以监听到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
的正负值来判断列表滚动的方法,然后通过改变Fab
的translationY
来让它移入或者移出屏幕。
五、总结
这篇文章,介绍了Fab
的基本用法、其它MD
控件的联动以及如何自定义FloatingActionButtonBehavior
。
更多文章,欢迎访问我的 Android 知识梳理系列:
- Android 知识梳理目录:www.jianshu.com/p/fd82d1899…
- 个人主页:lizejun.cn
- 个人知识总结目录:lizejun.cn/categories/
Material Design 控件知识梳理(4) FloatingActionButton相关推荐
- Material Design控件使用(二)
本篇接着之前的Material Design控件总结(一)往下学习support design包下其余控件,如果对Material Design不太熟悉的同学最好把第一篇看完再来看第二篇效果更好 本篇 ...
- Material Design控件使用
本文整合前面四篇的控件,再结合豆瓣读书的API,做了一个搜索书籍和查看书籍信息的Demo. 先上效果图: ##项目依赖库 dependencies {compile fileTree(dir: 'li ...
- Material Design控件使用(一)
最近学习了一下md设计风格和相对应的控件觉得挺棒的,真希望以后能做安卓设计风格的app,只是心有鱼而力不足,虽身为安卓程序员但由于公司设计成本却每天做着iOS风格的app,这感觉真是(此处省略一万字) ...
- Material Design控件使用学习 TabLayout+SwipeRefreshlayout
效果: Tablayout有点类似之前接触过的开源ViewPagerIndicator,将其与viewpager绑定,可实现viewpager的导航功能. SwipeRefreshLayout是官方出 ...
- android自动生成cardview,学习使用Material Design控件(三)使用CardView实现卡片效果...
本文主要介绍CardView的使用,CardView是继承自FrameLayout,使用比较简单,只需要用CardView包含其他View就可以实现卡片效果了. 实现效果如下: 加入依赖库 depen ...
- Material Design控件 之 CardView
1. 简介 CardView 是继承于 FrameLayout,官方说明它是一个带有圆角背景和阴影的Framelayout. 从英文解释它是一个卡片视图,CardView 可以作为一个子布局,也可以作 ...
- Material Design控件使用学习 toolbar+drawerlayout+ Snackbar
效果 1.,导包design包和appcompat-v7 ,设置Theme主题Style为NoActionbar 2.custom_toolbar.xml <?xml version=" ...
- Android Material Design 控件常用的属性
android:fitsSystemWindows="true" 是一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为t ...
- flutter初体验之基础控件知识
在naive开发中,大家对view肯定很熟悉,它代表着所有控件的祖先.在flutter中,也存在这么一个所有控件的祖先---Widget.Widget类是一个抽象类,定义在系统的framework.d ...
- flutter笔记4:使用material原生控件开发一个APP
接着上一篇,我们做一个这样的APP: 开始之前,我发现了一个好玩的东西,每次我们在终端中输入命令: flutter run 终端里会有这个东西: 按照上图所示,我们的进入这个网页看看是个啥: 好高大上 ...
最新文章
- 【机器学习】机器学习12个关键经验教训
- 微信小程序开发视频教程新鲜出炉
- python opencv 峰值信噪比
- @import注解使用
- VS2017控制台工程日志输出到log文件的同时输出到屏幕
- Java判断一组数字是否是等差数列
- 从迁移到Java 7的小技巧
- el-table使用fixed后,最后一行显示不全;el-table设置fixed后,最后一行被遮挡。
- Ubuntu 11.04 二进制包安装 flashget 显示 libexpat.so no...
- Microsoft SQL Server 2005 CTP 简体中文版
- iPhone 的续航有望加长!749 元的“磁吸充电宝”你会买吗?
- AI芯片、框架、语言与知识、量子计算……百度大脑6.0发布
- L1-003 个位数统计 (15 point(s))
- 编程基本功:如何判断两个线段有重叠?
- Qt翻译文件(.ts)的使用
- c语言输入abc求方程的根,编写程序,输入系数abc,计算任意二次方根的实根
- 无盘服务器chkdsk *: /f)修复命令,让你的电脑运行更快点 使用CHKDSK/F磁盘修复命令...
- 软件测试的艺术_读书笔记(一)
- 开发APP的费用是多少?
- Quantopian 入门系列二 - 流水线 (上)