Material Design 组件之 FloatingActionButton
MaterialDesign 设计规范在 Google I/O 2014 推出,这种设计理念一经推出就受到广大开发者的喜爱,主要侧重于纸墨化创作和突出设计的实体感,使得设计更接近于真实世界,力求平滑、连续的交互方式与用户体验,这种设计规范更能促进 Android 生态系统的发展,为此,Google 提供了一系列的符合 Material Design 风格的控件,如 FloatingActionButton、Snackbar、TabLayout 等。虽然经常在开发中用到,但是没有做记录,打算从头开始记录一下这些组件的使用,今天说一下 CoordinatorLayout 和 FloatingActionButton 相关的知识。
CoordinatorLayout
CoordinatorLayout 是一个加强版的 FramLayout,意味着如果不加任何限制,在 CoordinatorLayout 里面的子 View 都会默认出现在左上角,CoordinatorLayout 有两个主要的使用方式:
作为应用的顶层布局
作为与一个或多个子 View 交互的容器
可为 CoordinatorLayout 里面的子 View 指定 Behavior,就在单个父布局中提供许多不同的交互效果,子 View 之间也可以相互交互,CoordinatorLayout 可以使用CoordinatorLayout.DefaultBehavior 注解来指定子 View 的默认行为,总之,可以借助 CoordinatorLayout 实现不同的滚动效果。
FloatingActionButton
FloatingActionButton 是 Material Design 类型的按钮控件,一般表现是浮动在 UI 上层的圆形图标,有自己的 behavior 并可以设置锚点。
FloatingActionButton 有两种大小,分别是 normal(56dp) 和 mini(40dp) ,默认是 mini(40dp),其大小可以通过属性 fabSize 来指定需要的大小,当然也可以设置 fabSize 为 auto,系统会根据不同的屏幕选择合适的大小。
FloatingActionButton 间接继承 ImageView,可以使用如下方式在代码中设置图标:
1//设置图标
2fab.setImageDrawable(getResources().getDrawable(R.drawable.fab));
3fab.setImageResource(R.drawable.fab);
FloatingActionButton 的背景颜色默认是主题的 colorAccent 表示的值,在代码中可以通过如下方式修改 FloatingActionButton 的背景颜色,具体如下:
1//设置背景颜色
2fab.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#000000")));
可以通过如下方式设置 FloatingActionButton 的大小,具体如下:
1//设置大小
2fab.setSize(FloatingActionButton.SIZE_MINI);
那么,如何自定义 FloatingActionButton 的大小呢,可以从 FloatingActionButton 部分源码中看到决定其大小的尺寸是定义到 dimens 文件中的,具体由 design_fab_size_mini 和 design_fab_size_normal 来决定,部分代码如下:
1//源码
2private int getSizeDimension(@Size final int size) {
3 final Resources res = getResources();
4 switch (size) {
5 case SIZE_AUTO:
6 // If we're set to auto, grab the size from resources and refresh
7 final int width = res.getConfiguration().screenWidthDp;
8 final int height = res.getConfiguration().screenHeightDp;
9 return Math.max(width, height) < AUTO_MINI_LARGEST_SCREEN_WIDTH
10 ? getSizeDimension(SIZE_MINI)
11 : getSizeDimension(SIZE_NORMAL);
12 case SIZE_MINI:
13 return res.getDimensionPixelSize(R.dimen.design_fab_size_mini);
14 case SIZE_NORMAL:
15 default:
16 return res.getDimensionPixelSize(R.dimen.design_fab_size_normal);
17 }
18}
所以只需要创建 dimens 文件夹,在里面重新设置 design_fab_size_mini 和 design_fab_size_normal 的值即可自定义 FloatingActionButton 的大小了,具体如下:
1/**dimens.xml**/
2<?xml version="1.0" encoding="utf-8"?>
3<resources xmlns:tools="http://schemas.android.com/tools">
4 <dimen name="design_fab_size_mini" tools:override="true">20dp</dimen>
5 <dimen name="design_fab_size_normal" tools:override="true">100dp</dimen>
6</resources>
当然 FloatingActionButton 间接继承 ImageView,ImageView 的一些属性肯定可以使用,这里就不在说了。
FloatingActionButton 的属性
下面是一些常用的属性,具体如下:
1android:src //设置图标(24dp)
2app:backgroundTint //设置图标背景颜色。
3app:rippleColor //设置点击时水波纹颜色
4app:elevation //设置阴影大小
5app:fabSize //设置大小
6app:pressedTranslationZ //按下时距离Z轴的距离
7app:layout_anchor //设置锚点
8app:layout_anchorGravity//设置相对锚点的位置
关于属性,了解一下,具体使用时设置后观察效果不失为一种直观的学习方式。
简单使用
总觉得做笔记还是有效果图比较好,那就简单使用 CoordinatorLayout 和 FloatingActionButton 看一下具体效果,布局如下:
1<?xml version="1.0" encoding="utf-8"?>
2<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 xmlns:app="http://schemas.android.com/apk/res-auto"
7 tools:context="com.manu.materialdesignsamples.samples.SampleActivity">
8
9 <android.support.v7.widget.RecyclerView
10 android:id="@+id/rvData"
11 android:layout_width="match_parent"
12 android:layout_height="wrap_content"
13 android:layout_marginStart="12dp"
14 android:layout_marginEnd="12dp"
15 android:visibility="visible"/>
16
17 <android.support.design.widget.FloatingActionButton
18 android:id="@+id/fab"
19 android:layout_width="wrap_content"
20 android:layout_height="wrap_content"
21 android:layout_margin="12dp"
22 android:layout_gravity="bottom|end"
23 android:src="@drawable/fab"
24 android:scaleType="center"
25 app:backgroundTint="@color/colorAccent"
26 app:backgroundTintMode="src_in"
27 app:elevation="5dp"
28 app:rippleColor="#000000"
29 app:fabSize="auto"
30 app:pressedTranslationZ="10dp"/>
31
32</android.support.design.widget.CoordinatorLayout>
然后在设置 FloatingActionButton 的点击事件,具体如下:
1findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {
2 @Override
3 public void onClick(View v) {
4 Snackbar.make(v,"我是Snackbar...",Snackbar.LENGTH_SHORT)
5 .setAction("取消", new View.OnClickListener() {
6 @Override
7 public void onClick(View v) {
8 Toast.makeText(SampleActivity.this, "取消", Toast.LENGTH_SHORT).show();
9 }
10 }).show();
11 }
12});
先来一张效果图,具体如下:
可知 FloatingActionButton 会自动给 Snackbar 留出位置,避免 Snackbar 弹出时遮挡 FloatingActionButton ,因为在 FloatingActionButton 内部已经实现了使用 Snackbar 对应的 Behavior,CoordinatorLayout 会根据对应的 Behavior 的具体表现自动调整子 View 的位置,这里当然是 FloatingActionButton 的位置,可以试一试将根布局设置为 RelativeLayout 等,当然,此时 Snackbar 弹出时会遮挡 FloatingActionButton ,顾名思义 CoordinatorLayout 就是协调布局,关于 Behavior 这部分留到后面整理,今天就写到这了。