FloatingActionButtonPlus蒿柳,讓你輕松實(shí)現(xiàn)Google Inbox的效果


自Google Io 2014發(fā)布Material Design以來(lái),非常多知名應(yīng)用岳枷,如Evernote芒填、Teambition、Inbox等都使用了攜帶多個(gè)子按鈕的FloatingActionButton空繁。我個(gè)人非常喜歡這個(gè)效果殿衰,但是一個(gè)個(gè)的去布局寫動(dòng)畫,代碼還是蠻多的盛泡,所以想了想就把整個(gè)效果封裝起來(lái)了闷祥。順便也把它開源了,雖然不是什么很厲害的東西傲诵,不過(guò)還是希望大家能去點(diǎn)個(gè)fork啥的凯砍! 哈哈哈哈...??
OK,話不多說(shuō)拴竹,直接看我下面的Readme悟衩。


fabs
fabs

注意事項(xiàng)

該控件理論上最低支持到API版本14也就是Android4.0,并且由于是官方Support Library中FloatingActionButton的二次封裝殖熟,陰影的生成在API21以上和21以下并不太一樣局待,所以在不同版本的系統(tǒng)中的效果會(huì)存在一定的差異斑响。

該控件依賴了以下兩個(gè)support library菱属,使用者無(wú)需在項(xiàng)目里再次添加。
com.android.support:design:23.1.1
com.android.support:cardview-v7:23.1.0

項(xiàng)目地址

https://github.com/550609334/FloatingActionButtonPlus

如何使用


實(shí)現(xiàn)上圖的效果

btns.xml

<com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus
android:id="@+id/FabPlus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:switchFabColor="#DB4537"
app:switchFabIcon="@mipmap/ic_add_white_48dp"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<com.lzp.floatingactionbuttonplus.FabTagLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:tagText="Download"
    >
    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_get_app_white_48dp"
        app:backgroundTint="#468cb7"
        app:fabSize="mini" />
</com.lzp.floatingactionbuttonplus.FabTagLayout>

<com.lzp.floatingactionbuttonplus.FabTagLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:tagText="Favorites"
    >
    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_stars_white_48dp"
        app:backgroundTint="#818aa7"
        app:fabSize="mini" />
</com.lzp.floatingactionbuttonplus.FabTagLayout>


<com.lzp.floatingactionbuttonplus.FabTagLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:tagText="Send mail"
    >
    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_send_white_48dp"
        app:backgroundTint="#4BB7A7"
        app:fabSize="mini" />
</com.lzp.floatingactionbuttonplus.FabTagLayout>

<com.lzp.floatingactionbuttonplus.FabTagLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:tagText="shopping list"
    >
    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_shopping_cart_white_48dp"
        app:backgroundTint="#ff9800"
        app:fabSize="mini" />
</com.lzp.floatingactionbuttonplus.FabTagLayout>

<com.lzp.floatingactionbuttonplus.FabTagLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:tagText="Search this page"
    >

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_search_white_48dp"
        app:backgroundTint="#4284E4"
        app:fabSize="mini" />
</com.lzp.floatingactionbuttonplus.FabTagLayout>

</com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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"
>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlwaysCollapsed"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</android.support.v7.widget.RecyclerView>

<include layout="@layout/btns" />    

</android.support.design.widget.CoordinatorLayout>  

這樣就完成了上圖的效果舰罚。
最外層的com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus會(huì)帶有一個(gè)主按鈕纽门。FloatingActionButtonPlus中包含了多個(gè)FabTagLayout,而每一個(gè)FabTagLayout則就是一個(gè)item营罢。FabTagLayout帶有一個(gè)lable標(biāo)簽赏陵,你需要在FabTagLayout中再添加一個(gè)FloatingActionButton。請(qǐng)記住為每個(gè)item的FloatingActionButton添加上app:fabSize="mini"饲漾,將其設(shè)置為mini型蝙搔。可通過(guò)app:backgroundTint="color"更改這些fab的顏色考传。


定位

right_bottom
right_bottom

right_top
right_top

left_bottom
left_bottom
left_top
left_top

GIF會(huì)掉幀吃型,實(shí)際效果很流暢

如圖提供了四種position方式,默認(rèn)為right_bottom僚楞。其他為right_top勤晚、left_bottom枉层、left_top。在CoordinatorLayout中建議不要定位到top赐写,會(huì)被toolbar擋住鸟蜡。
position可在XML布局中設(shè)置,也可在JAVA代碼中設(shè)置挺邀。

XML

在com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus中添加

    app:position="left_top"

value還可以是right_bottom揉忘、left_bottomleft_top

Java Code

首先有四個(gè)常量分別為

  public static final int POS_LEFT_TOP = 0;  
  public static final int POS_LEFT_BOTTOM = 1;
  public static final int POS_RIGHT_TOP = 2;
  public static final int POS_RIGHT_BOTTOM = 3;

通過(guò)FloatingActionButtonPlus對(duì)象設(shè)置

  mActionButtonPlus = (FloatingActionButtonPlus) findViewById(R.id.FabPlus);
  mActionButtonPlus.setPosition(FloatingActionButtonPlus.POS_LEFT_TOP);

動(dòng)畫

動(dòng)畫暫時(shí)給了三種端铛,分別為fade癌淮、scale、bounce沦补,默認(rèn)為scale乳蓄。后續(xù)會(huì)可能會(huì)提供接口供使用者擴(kuò)展。動(dòng)畫同樣可以在XML中或Java中設(shè)置夕膀。

XML

在com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus中添加 fade虚倒、scale、bounce三個(gè)值中的一個(gè)产舞。如:

 app:animationMode = "scale"

另可設(shè)置動(dòng)畫持續(xù)時(shí)間魂奥,單位為毫秒,默認(rèn)為150毫秒

 app:animationDuration = "300"

Java code

首先有四個(gè)常量分別為

public static final int ANIM_FADE = 0;
public static final int ANIM_SCALE = 1;
public static final int ANIM_BOUNCE = 2;

通過(guò)FloatingActionButtonPlus對(duì)象設(shè)置

mActionButtonPlus.setPosition(FloatingActionButtonPlus.POS_LEFT_TOP);
mActionButtonPlus.setAnimation(FloatingActionButtonPlus.ANIM_SCALE);  

動(dòng)畫持續(xù)時(shí)間可通過(guò)

mActionButtonPlus.setAnimationDuration(300);

事件

暫時(shí)只給出了item的點(diǎn)擊事件易猫,如果有更多類型事件的需求耻煤,歡迎Email聯(lián)系我。

mActionButtonPlus.setOnItemClickListener(new FloatingActionButtonPlus.OnItemClickListener() {
        @Override
        public void onItemClick(FabTagLayout tagView, int position) {
            Toast.makeText(MainActivity.this, "Click btn" + position, Toast.LENGTH_SHORT).show();
        }
    });

滑動(dòng)顯示和滑動(dòng)隱藏

關(guān)于滑動(dòng)顯示隱藏准颓,這里有兩種方法哈蝇,

1、使用CoordinatorLayout

使用CoordinatorLayout的話攘已,首先要確保你的外層layout是android.support.design.widget.CoordinatorLayout炮赦,如我上面activity_main.xml中的實(shí)例代碼。之后你需要在com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus中添加上app:layout_behavior="com.lzp.floatingactionbuttonplus.FabBehavior"样勃,如下

<com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus
android:id="@+id/FabPlus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:switchFabColor="#DB4537"
app:switchFabIcon="@mipmap/ic_add_white_48dp"
app:layout_behavior="com.lzp.floatingactionbuttonplus.FabBehavior"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

</com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus>
2吠勘、監(jiān)聽滑動(dòng)距離(judge scorll distance)

在沒(méi)有使用CoordinatorLayout的情況下,我給出了兩個(gè)public method峡眶。 分別為showFab() 和 hideFab()剧防。通過(guò)FloatingActionButtonPlus對(duì)象去調(diào)用。所以你如果想要實(shí)現(xiàn)通過(guò)這個(gè)效果辫樱,需要你去獲取當(dāng)前Scroll的距離峭拘。例如在RecyclerView中你可以這么寫:

 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (recyclerView.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING) {
                if (dy > 0) {
                    mActionButtonPlus.hideFab();
                } else {
                    mActionButtonPlus.showFab();
                }
            }
        }
    });  

更多設(shè)置


XML

com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus
 app:switchFabIcon="@mipmap/ic_add_white_48dp"   <!--設(shè)置主Fab的icon圖標(biāo)-->    
 app:switchFabColor="#DB4537"                    <!--設(shè)置主Fab的顏色-->  
 app:mBackgroundColor="#99ffffff"                <!--設(shè)置item展開后的背景顏色,默認(rèn)為alpha99的白色-->  
com.lzp.floatingactionbuttonplus.FabTagLayout
 app:tagText="text"                          <!--設(shè)置item中l(wèi)able中顯示的文字--> 

Java Code

com.lzp.floatingactionbuttonplus.FloatingActionButtonPlus
mActionButtonPlus.setContentIcon(getResources().getDrawable(R.mipmap.ic_add_white_48dp)); //設(shè)置主Fab的icon圖標(biāo)
mActionButtonPlus.setRotateValues(45); //設(shè)置主Fab被點(diǎn)擊時(shí)旋轉(zhuǎn)的度數(shù),默認(rèn)為45度
boolean state = mActionButtonPlus.getSwitchFabDisplayState();  //獲取當(dāng)前Fab的顯示狀態(tài)棚唆,顯示時(shí)返回true暇赤,隱藏返回false
com.lzp.floatingactionbuttonplus.FabTagLayout
 tagView.setTagText("text");  //設(shè)置label中顯示的文字

其他

關(guān)于為什么不直接在FabTagLayout里集成FloatingActionButton

主要是因?yàn)镚oogle并沒(méi)有給出用java代碼設(shè)置FloatingActionButton的size的方法,所以沒(méi)辦法設(shè)置成mini型宵凌。我試過(guò)用反射去更改FloatingActionButton中的mSize這個(gè)private變量鞋囊,在api21之后,可行瞎惫,但21以下就會(huì)出現(xiàn)很多問(wèn)題溜腐,例如icon不會(huì)跟著變小,陰影會(huì)變成矩形瓜喇。這是因?yàn)樵贔loatingActionButton中是根據(jù)mSize的值去繪制陰影和決定icon大小的挺益。而這一切操作都是在它的constructor中完成,所以我選擇了讓使用者來(lái)指定每一個(gè)FloatingActionButton乘寒。 當(dāng)然日后也許我會(huì)試著制作一個(gè)獨(dú)立的FloatingActionButton來(lái)解決這個(gè)問(wèn)題望众。

關(guān)于遇到Bug

如果出現(xiàn)Bug,或者你有什么建議或需求伞辛,可以Email連系我烂翰。

E-Mail

tracy550609334@gmail.com or 550609334@qq.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蚤氏,隨后出現(xiàn)的幾起案子甘耿,更是在濱河造成了極大的恐慌,老刑警劉巖竿滨,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佳恬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡于游,警方通過(guò)查閱死者的電腦和手機(jī)毁葱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)曙砂,“玉大人头谜,你說(shuō)我怎么就攤上這事骏掀○海” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵截驮,是天一觀的道長(zhǎng)笑陈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)葵袭,這世上最難降的妖魔是什么涵妥? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮坡锡,結(jié)果婚禮上蓬网,老公的妹妹穿的比我還像新娘窒所。我一直安慰自己,他們只是感情好帆锋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布吵取。 她就那樣靜靜地躺著,像睡著了一般锯厢。 火紅的嫁衣襯著肌膚如雪皮官。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天实辑,我揣著相機(jī)與錄音捺氢,去河邊找鬼。 笑死剪撬,一個(gè)胖子當(dāng)著我的面吹牛摄乒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播残黑,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼缺狠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了萍摊?” 一聲冷哼從身側(cè)響起挤茄,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冰木,沒(méi)想到半個(gè)月后穷劈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踊沸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年歇终,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逼龟。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡评凝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腺律,到底是詐尸還是另有隱情奕短,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布匀钧,位于F島的核電站翎碑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏之斯。R本人自食惡果不足惜日杈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莉擒,春花似錦酿炸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蝇裤,卻和暖如春廷支,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栓辜。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工恋拍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藕甩。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓施敢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親狭莱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子僵娃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評(píng)論 25 707
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,406評(píng)論 2 45
  • 果然有壓力才有動(dòng)力腋妙,12.22寫了一篇《有壓力才有動(dòng)力》的文章默怨,當(dāng)時(shí)給自己一個(gè)目標(biāo)——12.29高分通過(guò)科目一,既...
    Eva華閱讀 259評(píng)論 0 0
  • 最近超愛~
    不只是只兔子閱讀 171評(píng)論 0 0