代码之家  ›  专栏  ›  技术社区  ›  Dr4ke the b4dass

使用自定义图标时,是否增加导航底视图中选定图标的高度?

  •  0
  • Dr4ke the b4dass  · 技术社区  · 4 年前

    请,我想使用自定义图标的底部导航视图在安卓这样。选择时如何更改图标位置?当它们被选中时,它们会上升一点。你是用一定的边距来创建一个选中的图标,还是有办法在android中设置高度?不过,这张图片来自flutter库。我想在一个Android Java项目中重现这一点。或者找一个实现它的库 enter image description here

    0 回复  |  直到 4 年前
        1
  •  1
  •   Dr4ke the b4dass    4 年前

    在你的 bottomNavigationView.setOnNavigationItemSelectedListener 对于每个按下的图标调用该动画方法 animateBottomIcon(int itemIndex, boolean isChecked) .

        BottomNavigationView bottomNav;
        BottomNavigationMenuView menuView;
    
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
          bottomNav.setClipChildren(false);
          bottomNav.setClipToPadding(false);
          bottomNav.setClipToOutline(false);
          menuView.setClipChildren(false);
        menuView = (BottomNavigationMenuView) bottomNav.getChildAt(0);
    }
    
    private void animateBottomIcon(int itemIndex, boolean isChecked) {
            final View view = menuView.getChildAt(itemIndex).findViewById(com.google.android.material.R.id.icon);
            ObjectAnimator translateUpAnimator = ObjectAnimator.ofFloat(view, "translationY",
                    0,
                    (float) (-(bottomNav.getHeight() / 2))).setDuration(500);
            if(!isChecked) {
                translateUpAnimator.start();
            }
            if(currentItemIndex != -1) {
                final View currentView = menuView.getChildAt(currentItemIndex).findViewById(com.google.android.material.R.id.icon);
                ObjectAnimator translateDownAnimator = ObjectAnimator.ofFloat(currentView, "translationY",
                        0,
                        (float) (-(bottomNav.getHeight() / 2))).setDuration(500);
                if (!isChecked) {
                    translateDownAnimator.reverse();
                }
            }
        }
    

    通常,菜单图标将被底部导航切断,以避免使用: android:clipChildren="false" 在布局的根视图和java类的onCreateView()中:

    bottomNav.setClipChildren(false); bottomNav.setClipToPadding(false); bottomNav.setClipToOutline(false);

    menuView.setClipChildren(false); .

    记住给你的底部导航视图一个固定的高度。

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_gravity="bottom"
        android:background="@color/white"
        app:itemIconSize="54dp"
        app:elevation="12dp"
        app:labelVisibilityMode="unlabeled"
        app:menu="@menu/menu_bottom_nav">[![enter image description here][1]][1]
    
        2
  •  -1
  •   dennisrufigill    4 年前

    您可以使用选择器来执行此操作。 为此,您需要两个单独的图像: 1) 当state selected为true时,表示您选择的图像

    XML格式

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_selected="true"
              android:drawable="@drawable/YOUR SELECTED IMAGE">
    
        </item>
        <item android:drawable="@drawable/YOUR DEFAULT IMAGE"></item>
    
    </selector>
    

    然后将此选择器用作底部导航视图中每个图像的可绘制图标。 您可以将选择器a/c中的其他属性添加到您的需求中。

        3
  •  -1
  •   Thành Hà Văn    4 年前

    我在那里看到了有趣的行为。但似乎android本机底部导航栏不支持将项目视图置于栏视图之外。也许你可以欺骗提供一个自定义的背景为您的导航栏与30%的顶部是透明的,其余的颜色像一个正常的导航栏。我没试过这个。