Material Design 设计规范在 Google I/O 2014 推出,这种设计理念一经推出就受到广大开发者的喜爱,主要侧重于纸墨化创作和突出设计的实体感,使得设计更接近于真实世界,力求平滑、连续的交互方式与用户体验,这种设计规范更能促进 Android 生态系统的发展,为此,Google 提供了一系列的符合 Material Design 风格的控件,如 FloatingActionButton、Snackbar、TabLayout 等。虽然经常在开发中用到,但是没有做记录,打算从头开始记录一下这些组件的使用,今天说一下 CoordinatorLayout 和 FloatingActionButton 相关的知识。

CoordinatorLayout

CoordinatorLayout 是一个加强版的 FramLayout,意味着如果不加任何限制,在 CoordinatorLayout 里面的子 View 都会默认出现在左上角,CoordinatorLayout 有两个主要的使用方式:

  1. 作为应用的顶层布局
  2. 作为与一个或多个子 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,可以使用如下方式在代码中设置图标:

//设置图标
fab.setImageDrawable(getResources().getDrawable(R.drawable.fab));
fab.setImageResource(R.drawable.fab);

FloatingActionButton 的背景颜色默认是主题的 colorAccent 表示的值,在代码中可以通过如下方式修改 FloatingActionButton 的背景颜色,具体如下:

//设置背景颜色
fab.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#000000")));

可以通过如下方式设置 FloatingActionButton 的大小,具体如下:

//设置大小
fab.setSize(FloatingActionButton.SIZE_MINI);

那么,如何自定义 FloatingActionButton 的大小呢,可以从 FloatingActionButton 部分源码中看到决定其大小的尺寸是定义到 dimens 文件中的,具体由 design_fab_size_mini 和 design_fab_size_normal 来决定,部分代码如下:

//源码
private int getSizeDimension(@Size final int size) {
final Resources res = getResources();
switch (size) {
case SIZE_AUTO:
// If we're set to auto, grab the size from resources and refresh
final int width = res.getConfiguration().screenWidthDp;
final int height = res.getConfiguration().screenHeightDp;
return Math.max(width, height) < AUTO_MINI_LARGEST_SCREEN_WIDTH
? getSizeDimension(SIZE_MINI)
: getSizeDimension(SIZE_NORMAL);
case SIZE_MINI:
return res.getDimensionPixelSize(R.dimen.design_fab_size_mini);
case SIZE_NORMAL:
default:
return res.getDimensionPixelSize(R.dimen.design_fab_size_normal);
}
}

所以只需要创建 dimens 文件夹,在里面重新设置 design_fab_size_mini 和 design_fab_size_normal 的值即可自定义 FloatingActionButton 的大小了,具体如下:

/**dimens.xml**/
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_fab_size_mini" tools:override="true">20dp</dimen>
<dimen name="design_fab_size_normal" tools:override="true">100dp</dimen>
</resources>

当然 FloatingActionButton 间接继承 ImageView,ImageView 的一些属性肯定可以使用,这里就不在说了。

FloatingActionButton 的属性

下面是一些常用的属性,具体如下:

android:src             //设置图标(24dp)
app:backgroundTint //设置图标背景颜色。
app:rippleColor //设置点击时水波纹颜色
app:elevation //设置阴影大小
app:fabSize //设置大小
app:pressedTranslationZ //按下时距离Z轴的距离
app:layout_anchor //设置锚点
app:layout_anchorGravity//设置相对锚点的位置

关于属性,了解一下,具体使用时设置后观察效果不失为一种直观的学习方式。

简单使用

总觉得做笔记还是有效果图比较好,那就简单使用 CoordinatorLayout 和 FloatingActionButton 看一下具体效果,布局如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.manu.materialdesignsamples.samples.SampleActivity"> <android.support.v7.widget.RecyclerView
android:id="@+id/rvData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:visibility="visible"/> <android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:layout_gravity="bottom|end"
android:src="@drawable/fab"
android:scaleType="center"
app:backgroundTint="@color/colorAccent"
app:backgroundTintMode="src_in"
app:elevation="5dp"
app:rippleColor="#000000"
app:fabSize="auto"
app:pressedTranslationZ="10dp"/> </android.support.design.widget.CoordinatorLayout>

然后在设置 FloatingActionButton 的点击事件,具体如下:

findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(v,"我是Snackbar...",Snackbar.LENGTH_SHORT)
.setAction("取消", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(SampleActivity.this, "取消", Toast.LENGTH_SHORT).show();
}
}).show();
}
});

先来一张效果图,具体如下:

可知 FloatingActionButton 会自动给 Snackbar 留出位置,避免 Snackbar 弹出时遮挡 FloatingActionButton,因为在 FloatingActionButton 内部已经实现了使用 Snackbar 对应的 Behavior,CoordinatorLayout 会根据对应的 Behavior 的具体表现自动调整子 View 的位置,这里当然是 FloatingActionButton 的位置,可以试一试将根布局设置为 RelativeLayout 等,当然,此时 Snackbar 弹出时会遮挡 FloatingActionButton,顾名思义 CoordinatorLayout 就是协调布局,关于 Behavior 这部分留到后面整理。

可以选择关注微信公众号:jzman-blog 获取最新更新,一起交流学习!

Material Design 组件之 FloatingActionButton的更多相关文章

  1. Material Design 组件之 CollapsingToolbarLayout

    CollapsingToolbarLayout 主要用于实现一个可折叠的标题栏,一般作为 AppBarLayout 的子 View 来使用,下面总结一下 CollapsingToolbarLayout ...

  2. Material Design 组件之NavigationView

    今天来看一下 NavigationView 的使用,NavigationView 是一个标准的导航菜单,其菜单内容由菜单资源文件来填充,NavigationView 一般和 DrawerLayout ...

  3. Material Design 组件之 AppBarLayout

    AppBarLayout 是一个垂直方向的 LinearLayout,它实现了许多符合 Material Design 设计规范的状态栏应该具有的功能,比如滚动手势. AppBarLayout 一般直 ...

  4. Material Design with the Android Design Support Library

    Material Design with the Android Design Support Library 原文http://www.sitepoint.com/material-design-a ...

  5. Jquery之家5个顶级Material Design框架

    谷歌Material Design在如今的前端页面设计中非常流行.Material Design的设计风格向我们展示了一个简单而有内涵的现代UI设计方案. Material Design是如此的简洁美 ...

  6. Top 15 - Material Design框架和类库(译)

    _Material design_是Google开发的,目的是为了统一公司的web端和手机端的产品风格.它是基于很多的原则,比如像合适的动画,响应式,以及颜色和阴影的使用.完整的指南详情请看这里(ht ...

  7. Android Material Design的FloatingActionButton,Snackbar和CoordinatorLayout

    如果是为了兼容低版本的Android系统,则需要引用Android Material Design的扩展支持库,我在之前的一篇文章张,较为详细的说明了如何导入Android Material Desi ...

  8. Material Design Lite,简洁惊艳的前端工具箱 之 交互组件。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, 博客地址为http://www.cnblogs.com/jasonnode/ . 网站上有对应 ...

  9. 基于React Native的Material Design风格的组件库 MRN

    基于React Native的Material Design风格的组件库.(为了平台统一体验,目前只打算支持安卓) 官方网站 http://mrn.js.org/ Github https://git ...

随机推荐

  1. Skeleton Screen加载占位图(内容出现前显示灰色占位图)的分析与实现

    今天有几个好友问了这个叫加载占位图的实现方法,我还在此问题下做了个回答.由于国内对这个的名词是各有各的叫法,所以这里直接用加载占位图来解释.相信很多人都看到过图中这样的加载方式: 这个图是一个国内知名 ...

  2. Service Mesh - gRPC 本地联调远程服务

    Description Service Mesh 架构下,服务间调用会通过服务名(Service Name)互相调用,比如在 Kubernetes .Docker Swarm 集群中,服务 IP 均由 ...

  3. 前端开发--Mongodb篇

    安装和启动 安装 官方安装文档 本地mac Os推荐使用Homebrew ⚠️ 目前直接使用--brew install mongodb-- 安装 mongodb 时提示:Error: No avai ...

  4. (数据科学学习手札79)基于geopandas的空间数据分析——深入浅出分层设色

    本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...

  5. Yuchuan_Linux_C编程之五gdb调试

    一.整体大纲 二.gdb调试 1. 启动gdb start -- 只执行一步    n -- next    s -- step(单步) -- 可以进入到函数体内部    c - continue - ...

  6. 修复Nginx的WebDAV功能

    如果想使用WebDAV来实现文件共享,尤其是想使用操作系统内置功能来挂载文件系统的话,省心的话还是用Apache吧. 下文介绍如何用Nginx来实现这个目标.Windows内置的客户端是Microso ...

  7. An incompatible version [1.1.33] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]

    Springboot项目启动出现如下错误信息 解决办法在此地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/native/1.2.1 ...

  8. String常见的方法有哪些?

    length();//计算字符串的长度 charAt();//截取一个字符 getChars();//截取多个字符 equals();//比较两个字符串 equalsIgnoreCase();//比较 ...

  9. OpenWrt tcpdump 抓包

    路由器用的是 网件的 4300 刷的是石像鬼双固件 1, 安装支持库opkg updateopkg install libpcapopkg install tcpdump 2, 设置条件开始捕获tcp ...

  10. Axure 文本框去掉边框 富文本 粘贴文字图标

    在今天做原型的过程中,碰到两个问题: 1 文本框该如何去掉边框 2 富文本粘贴文字图标 第一个问题:首先是思路错了,又跑到元件上面找边框,跑到style里面去border的线,结果是不成功. 正解:属 ...