一个自由定制的Material Design风格FloatingActionButton

一个自由定制的Material Design风格FloatingActionButton

先来看看效果

效果
效果

根据GIF可以看出,是一个可折叠菜单式的FloatingActionButton,在部分App中我们也能见到这种效果,FloatingActionButton我们并不陌生,Material Design推出以来,FloatingActionButton在开发中越来越常见,但是一旦想实现图中的效果,却无法用官方的FloatingActionButton去实现,那么该如何做到可折叠的FloatingActionButton,当然是自定义实现一个。

在GitHub上,其实已经有开源项目地址,实现了部分功能,但项目里菜单按钮只能为"+",不能自定义图片,无法设置展开/折叠角度,也无法指定展开/折叠动画的时间,所以根据这个项目,重新增加自己需要的功能。

下面就一步步学习怎么使用,根据个人需求,开发自己定制的Material Design 风格的 折叠 FloatingActionButton;

本项目已经开源到GitHub一个自由定制的Material Design风格FloatingActionButton,库不大,但是功能齐全,如果有特别需求,也可以根据库改写,里面注释很详细,很好理解,或者到简书下留言,期待大家共同把这个库完善起来

使用起来很简单,只需要两步 :依赖、布局, 就可以完成

1.添加依赖

添加依赖,在项目的build.gradle中添加

dependencies {
    compile 'com.ddz.materialdesign:FloatingActionButton:1.0.4'
}
'```

#### 2. 布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.ddz.floatingactionbutton.FloatingActionMenu
    android:id="@+id/fab1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/fab_margin">

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_share"
        app:fab_size="mini" />

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_like"
        app:fab_size="normal" />
</com.ddz.floatingactionbutton.FloatingActionMenu>

<com.ddz.floatingactionbutton.FloatingActionMenu
    android:id="@+id/fab2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_margin="@dimen/fab_margin"
    app:fab_addButton_icon="@drawable/icon_follow"
    app:fab_labelStyle="@style/lable_style">

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_colorNormal="@color/colorPrimary"
        app:fab_colorPressed="@color/colorPrimaryDark"
        app:fab_icon="@drawable/icon_follow"
        app:fab_size="mini"
        app:fab_title="顶部" />

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_like"
        app:fab_size="normal"
        app:fab_stroke_visible="false"
        app:fab_title="底部" />
</com.ddz.floatingactionbutton.FloatingActionMenu>


<com.ddz.floatingactionbutton.FloatingActionMenu
    android:id="@+id/fab3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_margin="5dp"
    app:fab_addButtonColorNormal="@color/colorPrimary"
    app:fab_addButtonColorPressed="@color/colorPrimaryDark"
    app:fab_addButtonPlusIconColor="@color/colorAccent"
    app:fab_addButtonSize="mini"
    app:fab_labelStyle="@style/lable_style">

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_follow"
        app:fab_size="mini"
        app:fab_title="顶部" />

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_like"
        app:fab_size="normal"
        app:fab_title="底部" />
</com.ddz.floatingactionbutton.FloatingActionMenu>

<com.ddz.floatingactionbutton.FloatingActionMenu
    android:id="@+id/fab4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_margin="5dp"
    app:fab_addButton_collapsed_rotation="0"
    app:fab_addButton_expanded_rotation="45"
    app:fab_addButton_rotation_duration="800"
    app:fab_labelStyle="@style/lable_style"
    app:fab_labelsPosition="right">

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_follow"
        app:fab_size="mini"
        app:fab_title="顶部" />

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_like"
        app:fab_size="normal"
        app:fab_title="底部" />
</com.ddz.floatingactionbutton.FloatingActionMenu>

</RelativeLayout>


布局很简单,一共四个FloatingActionMenu,每个Menu中两个FloatingActionButton,具体效果看图
![效果](https://raw.githubusercontent.com/dazhaoDai/FloatingActionButtonDemo/master/src/main/java/com/ddz/pic/GIF.gif)

为了更好的理解每个Menu中属性的含义,罗列出FloatingActionMenu的自定义属性

###### FloatingActionMenu自定义属性:

fab_addButtonColorNormal //菜单按钮默认颜色
fab_addButtonColorPressed //菜单按钮按下的颜色
fab_addButtonPlusIconColor //菜单按钮上的“+”号颜色,当设置了icon,“+”不会显示
fab_addButtonSize //菜单按钮的大小,有normal 和 mini 两种状态
fab_addButtonStrokeVisible //菜单按钮“+”边框是否可见
fab_addButton_collapsed_rotation //菜单按钮折叠时的角度
fab_addButton_expanded_rotation //菜单按钮展开的角度
fab_addButton_icon //菜单按钮的图标,设置了icon则“+”不可见
fab_addButton_rotation_duration //菜单按钮展开/折叠的时间
fab_expandDirection //菜单按钮展开的方向,有up/down/left/right四个方向,left/right时,Button不可以设置标签文字
fab_labelsPosition //Button的标签文字相对Button的位置,有 left /right两种
fab_labelStyle //设置标签文字的Style,只有Menu设置了 fab_labelStyle, Button才可以显示文字

###### FloatingActionButton自定义属性:

colorDisabled //Button按钮不可操作时的颜色
fab_colorNormal //Button按钮正常状态的颜色
fab_colorPressed //Button按钮按下时的颜色
fab_icon //Button按钮设置图标
fab_size ///Button按钮设置大小,同样有 normal 和 mini 两种大小
fab_stroke_visible //Button按钮边框是否可见
fab_title //Button按钮的标签文字


具体到每个Menu, 

第一个Menu:  fab1,

<com.ddz.floatingactionbutton.FloatingActionMenu
android:id="@+id/fab1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/fab_margin">

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_share"
        app:fab_size="mini" />

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_like"
        app:fab_size="normal" />
</com.ddz.floatingactionbutton.FloatingActionMenu>

Menu 没有任何设置, 上部分Button设置大小为mini,设置Icon,下部分大小为normal, 设置了Icon
    
第二个Menu:  fab2
    
<com.ddz.floatingactionbutton.FloatingActionMenu
    android:id="@+id/fab2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_margin="@dimen/fab_margin"
    app:fab_addButton_icon="@drawable/icon_follow"
    app:fab_labelStyle="@style/lable_style">
    <!-- 设置fab_title 时, 必须设置 fab_labelStyle ,才会生效-->

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_colorNormal="@color/colorPrimary"
        app:fab_colorPressed="@color/colorPrimaryDark"
        app:fab_icon="@drawable/icon_follow"
        app:fab_size="mini"
        app:fab_title="顶部" />

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_like"
        app:fab_size="normal"
        app:fab_stroke_visible="false"
        app:fab_title="底部" />
</com.ddz.floatingactionbutton.FloatingActionMenu>
Menu部分: 设置了图标 fab_addButton_icon,设置了fab_labelStyle

Button部分 :上部分Button设置了按下颜色 fab_colorPressed和正常的颜色 fab_colorNormal,以及图标fab_icon,大小fab_size为mini,设置了标签         fab_title  ,下部分 Button 设置了 图标fab_icon,按钮大小 fab_size,按钮边缘不可见 fab_stroke_visible ,标签文字 fab_title
    
第三个Menu:  fab3
    
<com.ddz.floatingactionbutton.FloatingActionMenu
    android:id="@+id/fab3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_margin="5dp"
    app:fab_addButtonColorNormal="@color/colorPrimary"
    app:fab_addButtonColorPressed="@color/colorPrimaryDark"
    app:fab_addButtonPlusIconColor="@color/colorAccent"
    app:fab_addButtonSize="mini"
    app:fab_labelStyle="@style/lable_style">

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_follow"
        app:fab_size="mini"
        app:fab_title="顶部" />

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_like"
        app:fab_size="normal"
        app:fab_title="底部" />
</com.ddz.floatingactionbutton.FloatingActionMenu>
Menu部分:设置了按钮 按下的颜色fab_addButtonColorNormal、正常的颜色fab_addButtonColorPressed、按钮“+” 的颜色 fab_addButtonPlusIconColor
按钮大小fab_addButtonSize、以及fab_labelStyle

Button部分: 上部分 设置了图标 fab_icon、 button大小 fab_size、 标签文字 fab_title   ,下部分同上
    
第四个Menu: fab4
    
 <com.ddz.floatingactionbutton.FloatingActionMenu
    android:id="@+id/fab4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_margin="5dp"
    app:fab_addButton_collapsed_rotation="0"
    app:fab_addButton_expanded_rotation="45"
    app:fab_addButton_rotation_duration="800"
    app:fab_labelStyle="@style/lable_style"
    app:fab_labelsPosition="right">

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_follow"
        app:fab_size="mini"
        app:fab_title="顶部" />

    <com.ddz.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fab_icon="@drawable/icon_like"
        app:fab_size="normal"
        app:fab_title="底部" />
</com.ddz.floatingactionbutton.FloatingActionMenu>
Menu部分 :设置了折叠角度 fab_addButton_collapsed_rotation, 展开角度fab_addButton_expanded_rotation,展开或折叠时间       fab_addButton_rotation_duration,设置了标签文字样式 fab_labelStyle, 设置了文字在按钮的位置 fab_labelsPosition

Button部分:设置了icon、size和title
    
通过上面四个Menu对比,很清楚的看到每个Menu的区别,以及对应的属性作用
    
##### FloatingActionMenu 补充
FloatingActionMenu有展开折叠的监听事件
  fl_menu = (FloatingActionMenu) findViewById(R.id.fab1);
  fl_menu.setOnFloatingActionsMenuUpdateListener(new FloatingActionMenu.OnFloatingActionsMenuUpdateListener() {
        @Override
        public void onMenuExpanded() {
            Toast.makeText(MainActivity.this, "打开", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onMenuCollapsed() {
            Toast.makeText(MainActivity.this, "折叠", Toast.LENGTH_SHORT).show();
        }
    });
    //也可以代码设置Menu的图标
    fl_menu.setButtonIcon(R.drawable.icon_like);
        
##### FloatingActionButton 补充
代码中可以对Button的进行更改
        
     fl_button = (FloatingActionButton) findViewById(R.id.fl_button);
    fl_button.setTitle("你好");
    fl_button.setIcon(R.drawable.icon_share);
    fl_button.setSize(20);
    fl_button.setColorNormal(getResources().getColor(R.color.colorAccent));
    fl_button.setColorPressed(getResources().getColor(R.color.colorAccent));

#### 写在最后
如果有特殊需求,大家可以star 或者 fork一份,进行完善, 也欢迎大家提出更好的方法。
简书地址---[一个自由定制的Material Design风格FloatingActionButton](http://www.jianshu.com/p/98c4c482fc8d)
源码下载---[一个自由定制的Material Design风格FloatingActionButton](http://download.csdn.net/detail/dazhaodai/9834597)
GitHub地址---[一个自由定制的Material Design风格FloatingActionButton](https://github.com/dazhaoDai/FloatingActionButtonDemo)

最后,感谢 
> http://luckymin.com/
> https://github.com/futuresimple/android-floating-action-button
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容

  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,681评论 22 664
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,239评论 25 707
  • 今天接到一个朋友的批评,因为她在12月22日当天发了很多孩子的照片给我,我没有反应,27日那天,她又分享了一篇网文...
    Huixia阅读 431评论 0 0
  • 小假期,提前回了家。以前的长辈们见了面都说我变了,成大人了。和她们在一起的感觉更是觉得亲切了很多,当然还有那个万年...
    L_1d4e阅读 310评论 0 0
  • 诗人终究是倒下了,随后便与他魂牵梦绕的沙土紧紧相拥着。他下意识地用手臂支撑身体,瘦弱的臂膀却因几日的跋涉丧失了最后...
    灯火流离人阅读 257评论 0 1