如何自定义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 ...
随机推荐
- 人生导师——如何学习C++的Windows方向
原来发在百度上,今天被人挖坟挖出来了,我就再贴出来吧. -----------------------有什么说的不对的地方---------------------- 本文原创,转载请注明出处并保持文 ...
- [转]shell脚本打印日志方法
该文章转自:http://blog.csdn.net/wylfengyujiancheng/article/details/50019299 ----------------------------- ...
- 移动语义 && 函数调用过程中的 lvalue
当以一个函数内的临时变量对象作为另一个函数的形参的时候,原函数内的临时对象即 rvalue,就会成为此函数内的 lvalue. 这样会重新导致效率低下,因为造成了大量复制操作. <utility ...
- ubuntu16.04 安装网易云音乐
最爱的播放器 网易云音乐 哈哈,刚刚折腾了双系统,立马开始了软件安装. 网易云音乐从官网下载对应的 64 位版本,我下载的是 netease-cloud-music_1.0.0_amd64_ubunt ...
- 【嵌入式开发板】8月终极暑促迅为Cortex-a9四核入门开发板
核心板参数 尺寸 50mm*60mm 高度 连同连接器在内0.26cm CPU Exynos4412,四核Cortex-A9,主频为1.4GHz-1.6GHz 内存 1GB 双通道 DDR3(2GB ...
- ZooKeeper系列1:ZooKeeper的配置
问题导读:1.zookeeper有哪些配置文件?2.zookeeper最低配置需要哪些配置项?3.zookeeper高级配置需要配置哪些项? ZooKeeper 的功能特性通过 ZooKeeper 配 ...
- Hadoop_HDFS文件读写代码流程解析和副本存放机制
Hadoop学习笔记总结 01.RPC(远程过程调用) 1. RPC概念 远程过程指的不是同一个进程的调用.它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 不能直接拿到远 ...
- OpenStack overview 笔记
Example architecture example architecture 至少需要两个节点启动一个虚拟机或者实例.可选的服务,例如Block storage和Object storage需要 ...
- codeforces 709B B. Checkpoints(水题)
题目链接: B. Checkpoints 题意: 给了n个点,现在给一个起点,问最少访问n-1个点的最小行走距离是多少; 思路: 分情况讨论就好了; AC代码: #include <iostre ...
- Watir、Selenium2、QTP区别
1.支持的语言 Watir:ruby Selenium2:支持多种语言,如:python,ruby,java,c#,php,perl,javascript QTP:vbscript 2.支持的浏览器 ...