前言

​ 本文是对《Android第一行代码》第十二章《最佳UI体验——Material Design实战》中关于悬浮按钮实现的学习和记录,主要内容包括——

FloatingActionButton控件

Snackbar控件

CoordinatorLayout布局

其实关于悬浮按钮的实现十分简单,Design Support库中做了大量的封装,只需要运用以上3个基础控件就可以完成一个最简单的悬浮球样式了。实际上,目前关于Android悬浮球的实现方案挺多的,网上可以找到很多酷炫的悬浮球实现方式。

悬浮按钮

立面设计是Material Design设计中一个非常重要的思想,在官方的示例中,最简单且具有代表性的立面设计就是悬浮按钮了。本节是对悬浮按钮以及其交互提示的学习和总结。

FloatingActionButton控件

FloatingActionButton可以直接实现一个悬浮球的效果,我们修改activity_main.xml中的代码,如下:

...

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/toolbar"

android:background="?attr/colorPrimary"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"

android:popupTheme="@style/ThemeOverlay.AppCompat.Light">

androidx.appcompat.widget.Toolbar>

android:id="@+id/fab"

android:layout_gravity="end|bottom"

android:layout_margin="16dp"

android:src="@drawable/ic_done"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

FrameLayout>

...

androidx.drawerlayout.widget.DrawerLayout>

为了更好的显示效果,使用src属性给悬浮球添加一个图标,具体效果如下:

可以观察到,这个悬浮球周围有一定阴影效果,以及点击的时候会有一些动态效果,这是FloatingActionButton自带的属性。但这个悬浮球什么都做不了,我们还需要一个Snackbar来实现相关操作。

Snackbar控件

Snackbar与Toast十分类似,不同的是,Toast只能向用户传递信息,Snackbar是一个可交互的控件。我们在MainActivity.java中添加代码:

public class MainActivity extends AppCompatActivity {

private DrawerLayout mDrawerLayout;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

...

FloatingActionButton fab = findViewById(R.id.fab);

fab.setOnClickListener(v->{

Snackbar.make(v,"Add data.", Snackbar.LENGTH_SHORT)

.setAction("Undo", w->{

Toast.makeText(MainActivity.this, "undo add data", Toast.LENGTH_SHORT).show();

}).show();

});

}

...

}

在FloatingActionButton控件中添加一个Snakbar控件,然后通过setAction方法实现具体的操作,该方法声明如下——

public Snackbar setAction(CharSequence text, final OnClickListener listener)

其中,text是文本内容,listenter对应点击事件。

最终实现效果如下:

显然这种效果并不完美,弹出的Undo操作遮挡了悬浮球,这不是我们想要的,好在Design Support库提供了一种叫做CoordinatorLayout的布局解决了这个问题。

CoordinatorLayout布局

CoordinatorLayout与FrameLayout十分类似,甚至可以看做是一个加强版的FrameLayout,它既是Design Support提供的一种布局,那必然也能与其他Design控件相得益彰,不妨来看activity_main文件——

androidx.appcompat.widget.Toolbar>

androidx.coordinatorlayout.widget.CoordinatorLayout>

.../>

androidx.drawerlayout.widget.DrawerLayout>

由于这里只将FrameLayout改成了CoordinatorLayout,因此中间的代码略去,效果如下:

终于不那么违和了。

本文Demo的完整源代码:https://github.com/zzuljs/MaterialDesign

android 布局收缩成球,Android使用Material Design实现悬浮按钮相关推荐

  1. appcompat v21: 让 Android 5.0 前的设备支持 Material Design

    1. 十大Material Design开源项目 2. appcompat v21: 让 Android 5.0 前的设备支持 Material Design 主题 AppCompat已经支持最新的调 ...

  2. 将Android布局转成图片,并保存到本地(解决JPEG图片因透明度变黑问题)

    最新碰到个需求,就是将布局转成图片导出,后来想到可以用view.draw(canvas)方法,将布局转为图片. 将布局转为bitmap public Bitmap getBitmap(View vie ...

  3. android 布局管理器,【Android开发】布局管理器-表格布局

    在XML布局文件中定义表格布局管理器的基本语法: 属性列表 > 需要添加的UI组件 多个TableRow TableLayout支持的XML属性: android:collapseColumns ...

  4. android 布局 站位符,基于android布局中的常用占位符介绍

    大家在做布局文件是肯定会遇到过下面的这种情况 填充出现问题,所以需要用到占位符规范填充 汉字常用占位符: android:layout_width="wrap_content" a ...

  5. Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200%

    系列文章 前言 在Android布局优化(一)从布局加载原理说起中我们说到了布局加载的两大性能瓶颈,通过IO操作将XML加载到内存中并进行解析和通过反射创建View.这里介绍一种避免运行时通过IO操作 ...

  6. android布局黑色字体颜色,Android开发之FloatingActionButton悬浮按钮基本使用、字体、颜色用法示例...

    本文实例讲述了Android开发之FloatingActionButton悬浮按钮基本使用.字体.颜色用法.分享给大家供大家参考,具体如下: 这里主要讲: FloatingActionsMenu自定义 ...

  7. android 布局圆变椭圆,Android实现自定义圆形、圆角和椭圆ImageView(使用Xfermode图形渲染方法)...

    一:简介: 在上一篇 这样可以省很多事情,比如测量步骤,以及不需要自己去写设置图片的方法,本文使用Xfermode模式中的DST_IN模式来实现要达到的效果,当然大家也可以采用其他的模式,比如SRC_ ...

  8. android布局时长分析,Android性能优化:布局优化 详细解析(含、、讲解 )

    前言 在 Android开发中,性能优化策略十分重要 本文主要讲解性能优化中的布局优化,希望你们会喜欢. 目录 1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. ...

  9. [Android]Android布局文件中的android:id=@*属性使用方法汇总以及介绍

    由于项目需要进行Android开发,因此一边开发,一边查阅资料,一边总结了Android布局文件中android:id="@*"属性的使用方法汇总以及介绍.id资源的引用 andr ...

最新文章

  1. React | Expected an assignment or function call and instead saw.....
  2. Java 效率工具之 Lombok
  3. 创建SM30表维护时权限组NC是什么用途?
  4. mysql高可用集群——MHA架构
  5. leetcode 638. Shopping Offers | 638. 大礼包(动态规划,多约束背包问题)
  6. #6281. 数列分块入门 5
  7. UITextField监控文字变化方法
  8. 如何编写 maptalks plugin
  9. opendds简单入门(二)
  10. windows下载安装adb(极其简单)
  11. Leetcode 每日一题——845. 数组中的最长山脉
  12. Uipath鼠标单击扩展教程
  13. 你大学生活最美好的时刻是?
  14. 2022 极术通讯-基于安谋科技 “星辰” STAR-MC1的灵动MM32F2570开发板深度评测
  15. SecureCRT9.0.1、SecureFX9.0.1,windows与mac版本下载
  16. 教你快速分辨有什么国际邮箱靠谱,世界十大邮箱排名分享
  17. 人工智能换脸python_AI换脸(手把手教你实现吴彦祖变苏大强)
  18. 世界观、价值观和人生观三者之间的关系
  19. 【Bugfix系列】/usr/bin/ld: cannot find -lxxx 的解决办法
  20. 基于Android的校园跳蚤市场(二手)的设计与实现

热门文章

  1. 【MySQL】MySQL SQL查询语法建议
  2. Greenplum创建存储过程
  3. 02=windows下安装PostgreSQL(The database cluster initialisation failed)
  4. 阿里云服务器mysql内存限制_高性能的MySQL(8)优化服务器配置一内存
  5. 2020远程面试几家公司后,从阿里、美团、携程带回来的面试题及文档
  6. 按职称分类统计人数access_500万人!2021会计职称报考人数要“爆”,通过率或刷新低...
  7. MyBatis--工具类模板
  8. Solrj 存储一个point类型的字段
  9. Scrapy Crawl 运行出错 AttributeError: 'xxxSpider' object has no attribute '_rules' 的问题解决...
  10. Java修炼之道--集合框架