如何自定义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>

这个时候再看效果:

修改成功

时间: 2024-08-27 09:14:28

如何自定义FloatingActionButton的大小的相关文章

android自定义Activity窗体大小

先给大家看图吧: 看,是不是很酷呢,呵呵. 这里我说关键的地方,就是自定义Activity的窗体大小. 这个登录框它不是一个Dialog,而是一个Activity. 如何定义,即把Activity的主题设置为Theme.Dialog <activity android:name=".AlertDialogActivity"  android:theme="@style/mytheme" /> mytheme.xml是我自定义的主题 mytheme.xml

Sublime Text3自定义全部字体大小、字体类型和背景颜色

一.定义侧栏的背景颜色.字体大小和间距 Sublime Text3的Afterglow主题链接为:https://github.com/YabataDesign/afterglow-theme 1.按键:ctrl+shift+p,弹出窗口中输入pro,选择图中的PackageResourceViewer:Open Resource. 2.在新窗口输入th,选中安装的主题,我个人安装的是Theme - Afterglow,就以Theme - Afterglow主题为例,其它主题类似. 3.在下拉列

图片上传 自定义设置图片大小

if($_FILES['img_slide']['name']=="") { $phpto_dir_name=""; header("Content-type:text/html;charset=utf-8"); echo "没有选择上传图片"; return $this->getDefaultView(); }else{ //将临时文件复制到upload_image目录下 $img_slide=($_FILES['im

使用设置自定义对话框的大小,位置,样式以及设置在安卓桌面上弹出对话框

第一步:创建对话框 MyDialog mydlg=new MyDialog(context); 第二步:获取对话框的window实例,通过window实例来控制对话框出现的位置,大小和弹出时候的场景 Window dlgwindow=mydly.getWindow(); 设置对话框最终显示位置 dlgWindow.setGravity(Gravity.TOP); 参数可以是Gravity.TOP(顶部),Gravity.BUTTON(底部),Gravity.LEFT(左边),Gravity.RI

自定义右键菜单

自定义右键菜单 技术一般水平有限,有什么错的地方,望大家指正. 自定义右键菜单,对于一些ERP系统,功能操作比较多,所以我们通常把常用的几个功能放在自定义的右键菜单里方便用户使用. 实现自定义菜单很简单,首先我们要屏蔽原始的右键菜单,自定义菜单出现在鼠标的位置,点击隐藏自定义菜单,过程就是这样的. *{margin:0;padding:0} a{text-decoration:none} ul li{list-style:none} .menu{border:1px solid black;bo

Android自定义View入门

View架构简介: 在Android中,控件主要以ViewGroup和View的形式存在.ViewGroup控件可以包含多个View控件,该复合控件负责其内部所有子控件的测量和绘制,并传递交互事件.如图, 在Android的移动开发中,每个Activity都包含了一个PhoneWindow对象,该对象将DecorView设置为应用窗口的根View.该视图上的所有监听事件都通过WindowManagerService来进行接收,并通过Activity来回调相应的onClickListener.De

Android之自定义AlertDialog和PopupWindow实现(仿微信Dialog)

我们知道,在很多时候,我们都不用Android内置的一些控件,而是自己自定义一些自己想要的控件,这样显得界面更美观. 今天主要是讲自定义AlertDialog和popupWindow的使用,在很多需求中,我们往往需要这样一个功能,就是点击一个按钮或者其它控件,弹出一个对话框,让用户可以在这个对话框中做一些事,比如输入.选择.提示.....等等,那么,这个弹出对话框的功能我们都知道可以用popupWindow和AlertDialog实现,的却,popupWindow被称为万能的,因为它的布局都是我

读书笔记3:uwp布局原理与自定义布局设计

布局原理 布局的意义 布局是页面编程的第一步,是总体把握页面上UI元素的显式.由于Windows10支持不同分辨率不同设备,布局显得越来越重要,也越来越复杂..布局有着如下意义: 1)代码逻辑:良好的布局会使代码逻辑非常清晰,不好的布局方案回事页面代码逻辑混乱.好的布局方案,要给予对各种布局控件的理解,然后充分的利用他们的特性去实现布局的效果. 2)效率性能:布局不仅仅是界面UI的事情,他甚至会影响程序的运行效率.当界面要展示大量的控件时,布局的好坏就会直接影响到程序的效率.良好的布局实现逻辑会

关于FloatingActionButton

由于FloatingActionButton本质上是ImageView,跟ImageView相关的就不介绍,这里重点介绍新加的几个属性. app:fabSize:FloatingActionButton的大小,有两种赋值分别是"mini"和"normal",默认是"normal". app:backgroundTint:FloatingActionButton默认正常显示时的背景颜色 app:elevation:FloatingActionBut