BottomNavigationView 實(shí)用技巧(去除自帶移動(dòng)動(dòng)畫)

控件使用 就不在此啰嗦了膀估,很簡單。

  • 分析原因
    1.BottomNavigationView耻讽,item大于3個(gè)的顯示奇怪的情況察纯,這個(gè)移動(dòng)動(dòng)畫幾乎都是不想要的。
    首先在BottomNavigationMenuView中针肥,有一個(gè)全局變量:mShiftingMode饼记,然后在創(chuàng)建Menu的時(shí)候buildMenuView()
public void buildMenuView() {
          ...
          mShiftingMode = mMenu.size() > 3;
          ...
}

當(dāng)size>3時(shí)候,設(shè)為ture慰枕。
然后在BottomNavigationItemView具则,設(shè)置check的時(shí)候:

@Override
    public void setChecked(boolean checked) {
        ViewCompat.setPivotX(mLargeLabel, mLargeLabel.getWidth() / 2);
        ViewCompat.setPivotY(mLargeLabel, mLargeLabel.getBaseline());
        ViewCompat.setPivotX(mSmallLabel, mSmallLabel.getWidth() / 2);
        ViewCompat.setPivotY(mSmallLabel, mSmallLabel.getBaseline());
        if (mShiftingMode) {
            if (checked) {
                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
                iconParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
                iconParams.topMargin = mDefaultMargin;
                mIcon.setLayoutParams(iconParams);
                mLargeLabel.setVisibility(VISIBLE);
                ViewCompat.setScaleX(mLargeLabel, 1f);
                ViewCompat.setScaleY(mLargeLabel, 1f);
            } else {
                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
                iconParams.gravity = Gravity.CENTER;
                iconParams.topMargin = mDefaultMargin;
                mIcon.setLayoutParams(iconParams);
                mLargeLabel.setVisibility(INVISIBLE);
                ViewCompat.setScaleX(mLargeLabel, 0.5f);
                ViewCompat.setScaleY(mLargeLabel, 0.5f);
            }
            mSmallLabel.setVisibility(INVISIBLE);
        } else {
            if (checked) {
                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
                iconParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
                iconParams.topMargin = mDefaultMargin + mShiftAmount;
                mIcon.setLayoutParams(iconParams);
                mLargeLabel.setVisibility(VISIBLE);
                mSmallLabel.setVisibility(INVISIBLE);

                ViewCompat.setScaleX(mLargeLabel, 1f);
                ViewCompat.setScaleY(mLargeLabel, 1f);
                ViewCompat.setScaleX(mSmallLabel, mScaleUpFactor);
                ViewCompat.setScaleY(mSmallLabel, mScaleUpFactor);
            } else {
                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
                iconParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
                iconParams.topMargin = mDefaultMargin;
                mIcon.setLayoutParams(iconParams);
                mLargeLabel.setVisibility(INVISIBLE);
                mSmallLabel.setVisibility(VISIBLE);

                ViewCompat.setScaleX(mLargeLabel, mScaleDownFactor);
                ViewCompat.setScaleY(mLargeLabel, mScaleDownFactor);
                ViewCompat.setScaleX(mSmallLabel, 1f);
                ViewCompat.setScaleY(mSmallLabel, 1f);
            }
        }

        refreshDrawableState();
    }

然后會(huì)根據(jù)shiftMode的值執(zhí)行不同的邏輯,所以產(chǎn)生了這個(gè)動(dòng)畫效果具帮。

官方?jīng)]有對(duì)這個(gè) 字段暴露出修改的方法博肋,所以可以通過反射的方式低斋,間接修改這個(gè)字段。

public class BottomNavigationViewHelper {
    public static void disableShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try {
            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView, false);
            shiftingMode.setAccessible(false);
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
                //noinspection RestrictedApi
                item.setShiftingMode(false);
                // set once again checked value, so view will be updated
                //noinspection RestrictedApi
                item.setChecked(item.getItemData().isChecked());
            }
        } catch (Exception e) {
            
        } 
    }
}

最后在使用BottomNavigationView的地方 調(diào)用:

bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomview);
// 去除動(dòng)畫效果
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

最后運(yùn)行起來束昵,移動(dòng)動(dòng)畫消除了,還附帶了一個(gè)很細(xì)微的抖動(dòng)動(dòng)畫葛峻,超贊的有木有锹雏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市术奖,隨后出現(xiàn)的幾起案子礁遵,更是在濱河造成了極大的恐慌,老刑警劉巖采记,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佣耐,死亡現(xiàn)場離奇詭異,居然都是意外死亡唧龄,警方通過查閱死者的電腦和手機(jī)兼砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來既棺,“玉大人讽挟,你說我怎么就攤上這事⊥杳幔” “怎么了耽梅?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胖烛。 經(jīng)常有香客問我眼姐,道長,這世上最難降的妖魔是什么佩番? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任众旗,我火速辦了婚禮,結(jié)果婚禮上趟畏,老公的妹妹穿的比我還像新娘逝钥。我一直安慰自己,他們只是感情好拱镐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布艘款。 她就那樣靜靜地躺著,像睡著了一般沃琅。 火紅的嫁衣襯著肌膚如雪哗咆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天益眉,我揣著相機(jī)與錄音晌柬,去河邊找鬼姥份。 笑死,一個(gè)胖子當(dāng)著我的面吹牛年碘,可吹牛的內(nèi)容都是我干的澈歉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屿衅,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼埃难!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涤久,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤涡尘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后响迂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體考抄,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年蔗彤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了川梅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡然遏,死狀恐怖挑势,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啦鸣,我是刑警寧澤潮饱,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站诫给,受9級(jí)特大地震影響香拉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜中狂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一凫碌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胃榕,春花似錦盛险、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至楔壤,卻和暖如春鹤啡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹲嚣。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工递瑰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祟牲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓抖部,卻偏偏與公主長得像说贝,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慎颗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,091評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫乡恕、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,098評(píng)論 4 62
  • 回首頁 第一部分 Drupal簡介 Drupal overview A tour of Drupal fundam...
    王乂閱讀 2,029評(píng)論 0 9
  • 我們相識(shí)了九年倍试,在這九年里讯屈,我們以好朋友的姿態(tài)相處著,唯一的不同是之前的六年县习,我們不是彼此的唯一涮母,彼此之間,只...
    夜里簫閱讀 310評(píng)論 0 1
  • 昨天在給豆豆洗澡躁愿,他突然說胳膊疼叛本,才發(fā)現(xiàn)胳膊及手腕上有幾處抓傷。問他誰打的彤钟,他一會(huì)說這個(gè)来候,一會(huì)說那個(gè),好像不愿意告...
    菜根老譚Fighting閱讀 304評(píng)論 0 0