Android开发Android开发经验谈程序员

Android Design 28 BottomNavigati

2018-10-11  本文已影响93人  WangJie0822
image.png

前言

BottomNavigationView 的使用

implementation 'com.android.support:design:27.1.1'
<android.support.design.widget.BottomNavigationView
            android:id="@+id/bnv"
            android:layout_width="match_parent"
            android:layout_height="@dimen/app_spacing_multiple_12"
            android:background="@color/white"
            android:bind_bnv_onItemSelected="@{viewModel.command.onItemSelected}"
            android:textSize="@dimen/app_text_size_14"
            app:itemIconTint="@color/app_selector_main_bottom_tint"
            app:itemTextColor="@color/app_selector_main_bottom_tint"
            app:menu="@menu/app_menu_main_bottom" />
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/menu_hospital"
        android:icon="@drawable/app_selector_main_bottom_hospital"
        android:title="@string/app_main_bottom_hospital" />
    <item
        android:id="@+id/menu_consult"
        android:icon="@drawable/app_selector_main_bottom_consult"
        android:title="@string/app_main_bottom_consult" />
    <item
        android:id="@+id/menu_contacts"
        android:icon="@drawable/app_selector_main_bottom_contacts"
        android:title="@string/app_main_bottom_contacts" />
    <item
        android:id="@+id/menu_setting"
        android:icon="@drawable/app_selector_main_bottom_setting"
        android:title="@string/app_main_bottom_setting" />
</menu>
屏幕快照 2018-10-11 15.55.10.png
/**
 * 关闭切换动画效果
 * - library 28 以下使用
 */
@SuppressLint("RestrictedApi")
fun BottomNavigationView.disableShiftMode() {
    val menuView = this.getChildAt(0) as BottomNavigationMenuView
    try {
        val shiftingMode = menuView.javaClass.getDeclaredField("mShiftingMode")
        shiftingMode.isAccessible = true
        shiftingMode.setBoolean(menuView, false)
        shiftingMode.isAccessible = false
        for (i in 0 until menuView.childCount) {
            val item = menuView.getChildAt(i) as BottomNavigationItemView
            item.setShiftingMode(false)
            item.setChecked(item.itemData.isChecked)
        }
    } catch (e: NoSuchFieldException) {
        Log.e("Common_BottomNavigation", "Unable to get shift mode field", e)
    } catch (e: IllegalAccessException) {
        Log.e("Common_BottomNavigation", "Unable to change value of shift mode", e)
    }
}
    mNavigation.disableShiftMode()
屏幕快照 2018-10-11 15.58.48.png

Design 28 中的变化

implementation 'com.android.support:design:28.0.0'
BottomNavigationMenuView.class
private boolean isShifting(int labelVisibilityMode, int childCount) {
        return labelVisibilityMode == -1 ? childCount > 3 : labelVisibilityMode == 0;
    }
BottomNavigationItemView.class
public void setChecked(boolean checked) {
        this.largeLabel.setPivotX((float)(this.largeLabel.getWidth() / 2));
        this.largeLabel.setPivotY((float)this.largeLabel.getBaseline());
        this.smallLabel.setPivotX((float)(this.smallLabel.getWidth() / 2));
        this.smallLabel.setPivotY((float)this.smallLabel.getBaseline());
        switch(this.labelVisibilityMode) {
        case -1:
            if (this.isShifting) {
                if (checked) {
                    this.setViewLayoutParams(this.icon, this.defaultMargin, 49);
                    this.setViewValues(this.largeLabel, 1.0F, 1.0F, 0);
                } else {
                    this.setViewLayoutParams(this.icon, this.defaultMargin, 17);
                    this.setViewValues(this.largeLabel, 0.5F, 0.5F, 4);
                }

                this.smallLabel.setVisibility(4);
            } else if (checked) {
                this.setViewLayoutParams(this.icon, (int)((float)this.defaultMargin + this.shiftAmount), 49);
                this.setViewValues(this.largeLabel, 1.0F, 1.0F, 0);
                this.setViewValues(this.smallLabel, this.scaleUpFactor, this.scaleUpFactor, 4);
            } else {
                this.setViewLayoutParams(this.icon, this.defaultMargin, 49);
                this.setViewValues(this.largeLabel, this.scaleDownFactor, this.scaleDownFactor, 4);
                this.setViewValues(this.smallLabel, 1.0F, 1.0F, 0);
            }
            break;
        case 0:
            if (checked) {
                this.setViewLayoutParams(this.icon, this.defaultMargin, 49);
                this.setViewValues(this.largeLabel, 1.0F, 1.0F, 0);
            } else {
                this.setViewLayoutParams(this.icon, this.defaultMargin, 17);
                this.setViewValues(this.largeLabel, 0.5F, 0.5F, 4);
            }

            this.smallLabel.setVisibility(4);
            break;
        case 1:
            if (checked) {
                this.setViewLayoutParams(this.icon, (int)((float)this.defaultMargin + this.shiftAmount), 49);
                this.setViewValues(this.largeLabel, 1.0F, 1.0F, 0);
                this.setViewValues(this.smallLabel, this.scaleUpFactor, this.scaleUpFactor, 4);
            } else {
                this.setViewLayoutParams(this.icon, this.defaultMargin, 49);
                this.setViewValues(this.largeLabel, this.scaleDownFactor, this.scaleDownFactor, 4);
                this.setViewValues(this.smallLabel, 1.0F, 1.0F, 0);
            }
            break;
        case 2:
            this.setViewLayoutParams(this.icon, this.defaultMargin, 17);
            this.largeLabel.setVisibility(8);
            this.smallLabel.setVisibility(8);
        }

        this.refreshDrawableState();
        this.setSelected(checked);
    }
if (checked) {
                this.setViewLayoutParams(this.icon, (int)((float)this.defaultMargin + this.shiftAmount), 49);
                this.setViewValues(this.largeLabel, 1.0F, 1.0F, 0);
                this.setViewValues(this.smallLabel, this.scaleUpFactor, this.scaleUpFactor, 4);
            } else {
                this.setViewLayoutParams(this.icon, this.defaultMargin, 49);
                this.setViewValues(this.largeLabel, this.scaleDownFactor, this.scaleDownFactor, 4);
                this.setViewValues(this.smallLabel, 1.0F, 1.0F, 0);
            }
BottomNavigationView.class
this.setLabelVisibilityMode(a.getInteger(styleable.BottomNavigationView_labelVisibilityMode, -1));
<attr name="labelVisibilityMode">
      
      <enum name="auto" value="-1"/>
      
      <enum name="selected" value="0"/>
      
      <enum name="labeled" value="1"/>
      
      <enum name="unlabeled" value="2"/>
    </attr>
<android.support.design.widget.BottomNavigationView
            android:id="@+id/bnv"
            android:layout_width="match_parent"
            android:layout_height="@dimen/app_spacing_multiple_12"
            android:background="@color/white"
            android:bind_bnv_onItemSelected="@{viewModel.command.onItemSelected}"
            android:textSize="@dimen/app_text_size_14"
            app:itemIconTint="@color/app_selector_main_bottom_tint"
            app:itemTextColor="@color/app_selector_main_bottom_tint"
            app:labelVisibilityMode="labeled"
            app:menu="@menu/app_menu_main_bottom" />

总结

上一篇 下一篇

猜你喜欢

热点阅读