Android FAB自定义按钮大小以及中间icon大小
2017-03-21 本文已影响1367人
Dragon_Boat
项目里有个全局浮动的按钮,感觉很适合用FAB,说不定以后还能配合嵌套滚动走一发(
其实是偷懒不想写hide(),show()的动画).
Fab其实是Google为Material Design规范设计的一个控件,所以遵循了标准的设计规范,这同时意味着其可定制性自然就小了很多。
比如:Fab的Size大小只有建议的:mini,normal,auto可以选择,而其中居中的icon,更是没办法直接通过属性指定调整。
有问题,看源码
很容易从构造函数入手,查看到如下代码:
mMaxImageSize = (int) getResources().getDimension(R.dimen.design_fab_image_size);
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 = ConfigurationHelper.getScreenWidthDp(res);
final int height = ConfigurationHelper.getScreenHeightDp(res);
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);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int preferredSize = getSizeDimension();
mImagePadding = (preferredSize - mMaxImageSize) / 2;
可以看到,fab的大小实际上最终是从dimen文件中读取,而内部中心icon距离两边的padding则是由mMaxImageSize这个变量确定,其值会从R.dimen.design_fab_image_size
中读取,所以,如果想改变Fab的大小,我们那需要做的是,在dimen中,覆写这两个值:
<!-- 重定义fab大小-->
<dimen name="design_fab_size_normal" tools:override="true">40dp</dimen>
<dimen name="design_fab_image_size" tools:override="true">20dp</dimen>
tools:override="true"
表示覆盖系统已有的值。
这个方法的弊端在于,Google如果改动了属性名称,则自定义大小就会失败。因此,最好还是遵循设计规范来使用FAB