android 布局收缩成球,Android使用Material Design实现悬浮按钮
前言
本文是对《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实现悬浮按钮相关推荐
- appcompat v21: 让 Android 5.0 前的设备支持 Material Design
1. 十大Material Design开源项目 2. appcompat v21: 让 Android 5.0 前的设备支持 Material Design 主题 AppCompat已经支持最新的调 ...
- 将Android布局转成图片,并保存到本地(解决JPEG图片因透明度变黑问题)
最新碰到个需求,就是将布局转成图片导出,后来想到可以用view.draw(canvas)方法,将布局转为图片. 将布局转为bitmap public Bitmap getBitmap(View vie ...
- android 布局管理器,【Android开发】布局管理器-表格布局
在XML布局文件中定义表格布局管理器的基本语法: 属性列表 > 需要添加的UI组件 多个TableRow TableLayout支持的XML属性: android:collapseColumns ...
- android 布局 站位符,基于android布局中的常用占位符介绍
大家在做布局文件是肯定会遇到过下面的这种情况 填充出现问题,所以需要用到占位符规范填充 汉字常用占位符: android:layout_width="wrap_content" a ...
- Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200%
系列文章 前言 在Android布局优化(一)从布局加载原理说起中我们说到了布局加载的两大性能瓶颈,通过IO操作将XML加载到内存中并进行解析和通过反射创建View.这里介绍一种避免运行时通过IO操作 ...
- android布局黑色字体颜色,Android开发之FloatingActionButton悬浮按钮基本使用、字体、颜色用法示例...
本文实例讲述了Android开发之FloatingActionButton悬浮按钮基本使用.字体.颜色用法.分享给大家供大家参考,具体如下: 这里主要讲: FloatingActionsMenu自定义 ...
- android 布局圆变椭圆,Android实现自定义圆形、圆角和椭圆ImageView(使用Xfermode图形渲染方法)...
一:简介: 在上一篇 这样可以省很多事情,比如测量步骤,以及不需要自己去写设置图片的方法,本文使用Xfermode模式中的DST_IN模式来实现要达到的效果,当然大家也可以采用其他的模式,比如SRC_ ...
- android布局时长分析,Android性能优化:布局优化 详细解析(含、、讲解 )
前言 在 Android开发中,性能优化策略十分重要 本文主要讲解性能优化中的布局优化,希望你们会喜欢. 目录 1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. ...
- [Android]Android布局文件中的android:id=@*属性使用方法汇总以及介绍
由于项目需要进行Android开发,因此一边开发,一边查阅资料,一边总结了Android布局文件中android:id="@*"属性的使用方法汇总以及介绍.id资源的引用 andr ...
最新文章
- React | Expected an assignment or function call and instead saw.....
- Java 效率工具之 Lombok
- 创建SM30表维护时权限组NC是什么用途?
- mysql高可用集群——MHA架构
- leetcode 638. Shopping Offers | 638. 大礼包(动态规划,多约束背包问题)
- #6281. 数列分块入门 5
- UITextField监控文字变化方法
- 如何编写 maptalks plugin
- opendds简单入门(二)
- windows下载安装adb(极其简单)
- Leetcode 每日一题——845. 数组中的最长山脉
- Uipath鼠标单击扩展教程
- 你大学生活最美好的时刻是?
- 2022 极术通讯-基于安谋科技 “星辰” STAR-MC1的灵动MM32F2570开发板深度评测
- SecureCRT9.0.1、SecureFX9.0.1,windows与mac版本下载
- 教你快速分辨有什么国际邮箱靠谱,世界十大邮箱排名分享
- 人工智能换脸python_AI换脸(手把手教你实现吴彦祖变苏大强)
- 世界观、价值观和人生观三者之间的关系
- 【Bugfix系列】/usr/bin/ld: cannot find -lxxx 的解决办法
- 基于Android的校园跳蚤市场(二手)的设计与实现
热门文章
- 【MySQL】MySQL SQL查询语法建议
- Greenplum创建存储过程
- 02=windows下安装PostgreSQL(The database cluster initialisation failed)
- 阿里云服务器mysql内存限制_高性能的MySQL(8)优化服务器配置一内存
- 2020远程面试几家公司后,从阿里、美团、携程带回来的面试题及文档
- 按职称分类统计人数access_500万人!2021会计职称报考人数要“爆”,通过率或刷新低...
- MyBatis--工具类模板
- Solrj 存储一个point类型的字段
- Scrapy Crawl 运行出错 AttributeError: 'xxxSpider' object has no attribute '_rules' 的问题解决...
- Java修炼之道--集合框架