如何自定义FloatingActionButton的大小
Google最近为了让开发者更好的更规范的应用Material Design设计思想,特意放出了android support design library,里面含有更多Material Design的标志性组件,其中最常用的就是那个圆形按钮,叫做Floating Action Button,可以简称为FAB。一个使用该控件的例子为:
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginLeft="25dp"
android:layout_gravity="start|top"
app:borderWidth="0dp"
app:fabSize="normal"
app:elevation="4dp"
android:scaleType="center"
android:src="@drawable/btn_menu" />
注意,在跟布局中需要配置app这个命令空间:
xmlns:app="http://schemas.android.com/apk/res-auto"
这里关注FAB的app:fabSize这个属性,它是用来规定大小,但是发现只有两个值:mini和normal,默认情况下官方推荐的宽高是56dp,但是如果设计师需要你显示一个比较大一些的FAB,比如100dp(这里发现将fabSize设置成normal或者mini都很小),该怎么办?
第一反应是修改layout_height和layout_width这两个属性,将他们设置成100dp,最后却发现成了这个怂样:

看来改变上述两个属性是不行的,那么我们来看FloatingActionButton的源码,在它的构造函数中,有下列代码:
ShadowViewDelegate delegate = new ShadowViewDelegate() {
public float getRadius() {
return (float)FloatingActionButton.this.getSizeDimension() / 2.0F;
}
public void setShadowPadding(int left, int top, int right, int bottom) {
FloatingActionButton.this.mShadowPadding.set(left, top, right, bottom);
FloatingActionButton.this.setPadding(left + FloatingActionButton.this.mContentPadding, top + FloatingActionButton.this.mContentPadding, right + FloatingActionButton.this.mContentPadding, bottom + FloatingActionButton.this.mContentPadding);
}
public void setBackgroundDrawable(Drawable background) {
FloatingActionButton.super.setBackgroundDrawable(background);
}
};
if(VERSION.SDK_INT >= 21) {
this.mImpl = new FloatingActionButtonLollipop(this, delegate);
} else {
this.mImpl = new FloatingActionButtonEclairMr1(this, delegate);
}
这里的mImpl是一个FloatingActionButtonImpl的实现类,FloatingActionButton大部分的操作实际上都是在操作这个mImpl,这个mImpl在被new出来的时候会判断当前环境是不是API level大于等于21(实际上在小于21的时候,他用drawable绘制了一层阴影从而有类似于21以上的evevation的效果),随后创建mImpl的时候传入了delegate这个参数,ShadowViewDelegate实际上就是个drawable的包装类。我们看getRadius这个实现方法,显然它是计算半径的,所以要想定制FAB的宽高,得要从这里找文章。
具体看getSizeDimension这个方法:
final int getSizeDimension() {
switch(this.mSize) {
case 0:
default:
return this.getResources().getDimensionPixelSize(dimen.fab_size_normal);
case 1:
return this.getResources().getDimensionPixelSize(dimen.fab_size_mini);
}
}
原来app:fabSize实际上是在调用fab_size_normal和fab_size_mini这两个dimen的值,相应的对应了normal和mini这两种情况,那么我们可以想到在我们的代码中国同样定义这两个dimen值对原来的进行覆盖,于是我们在醒目代码的dimen.xml中定义:
<resources>
<dimen name="fab_size_normal">100dp</dimen>
</resources>
这个时候再看效果:

修改成功
如何自定义FloatingActionButton的大小的更多相关文章
- C# 将Excel转为PDF时自定义表格纸张大小
通过后端程序将Excel表格转为PDF格式时,直接转换后的PDF效果可能出现表格页面过小或者过大,导致页面内容分布不均.要改善转换后的文档效果,只需在转换前自定义表格纸张大小,即可调整转换后的PDF页 ...
- Sublime Text3自定义全部字体大小、字体类型和背景颜色
一.定义侧栏的背景颜色.字体大小和间距 Sublime Text3的Afterglow主题链接为:https://github.com/YabataDesign/afterglow-theme 1.按 ...
- [Selenium] 最大化或自定义浏览器的大小
driver.manage().window().maximize(); //将浏览器设置为最大化的状态 driver.manage().window().setSize(new Dimens ...
- android自定义Activity窗体大小
先给大家看图吧: 看,是不是很酷呢,呵呵. 这里我说关键的地方,就是自定义Activity的窗体大小. 这个登录框它不是一个Dialog,而是一个Activity. 如何定义,即把Activity的主 ...
- C#中使用自定义的纸张大小
using System.Drawing.Printing; using System.Drawing; private void Test() { PrintDocument m_pdoc = ne ...
- 旋转屏幕时,假如自定义的xib大小变了,可能是这个属性没有修改
虽然xib内部启用了自动布局,但是当xib放入外界,xib自身的autoresizing是存在的
- php 图像裁剪(自定义裁剪图片大小)
<?php /** * 图像裁剪 * @param $title string 原图路径 * @param $content string 需要裁剪的宽 * @param $encode str ...
- Material Design 组件之 FloatingActionButton
Material Design 设计规范在 Google I/O 2014 推出,这种设计理念一经推出就受到广大开发者的喜爱,主要侧重于纸墨化创作和突出设计的实体感,使得设计更接近于真实世界,力求平滑 ...
- 关于FloatingActionButton
由于FloatingActionButton本质上是ImageView,跟ImageView相关的就不介绍,这里重点介绍新加的几个属性. app:fabSize:FloatingActionButto ...
随机推荐
- Autocomplete:属性介绍、firefox中文支持问题
如有问题,请前往 http://www.cnblogs.com/dreamowneryong/p/4953911.html 原文评论交流 一,属性介绍 * minChars (Number) 在触发a ...
- P2P行业专业术语(最全)
网贷:P2P网络借款,指个体与个体之间通过网站实现借贷,中间网站称为网贷平台,简称平台. 角色类 投资者:在网站上把钱借出去的用户,年龄必须是18周岁以上具有中国国籍的公民. 借款者(贷款者):是指有 ...
- freemarker如何遍历HashMap
查询资料有以下两种方法: 1. <#if appMap?exists> <#list appMap?keys as key> key:${key} value:${appMap ...
- 面向对象and类
类和对象: 1.什么叫类:类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来生产真实的物体(实例). 2.什么叫对象:睁开眼,你看到的一切的事物都是一个个的对 ...
- nyoj 284 坦克大战 简单搜索
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少 ...
- Python基础之函数等等
三元运算 三元运算(三目运算),是对简单的条件语句的缩写. 1 2 3 4 5 # 书写格式 result = 值1 if 条件 else 值2 # 如果条件成立,那么将 "值1&q ...
- fcntl 获取文件状态标志
int fcntl(int fd,int cmd,...) 函数fcntl提供了非常丰富的功能.主要依赖于cmd的各种参数: 复制已有的文件描述符 F_DUPFD,F_DUPFD_CLOEXEC 获取 ...
- Sql Practice 2
之前写了一个SP用来向dimention table插入0 -1 dummy row的值,但今天在process adventureworksdw2008示例 数据库的时候报错,查看了一下,是因为自己 ...
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
codevs 1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如 ...
- 深入理解UIApplication和ios程序启动过程
在深入理解UIApplication前我们先了解ios程序的启动过程: UIApplication类在ios里面为app的管理和协调提供一个集中的点,每一个app有一个UIApplication的实例 ...