Android 如何更改特定底部栏导航项的大小和形状

Android 如何更改特定底部栏导航项的大小和形状,android,android-bottomnav,Android,Android Bottomnav,我正在尝试实现这个底部栏,它包含一个比其他栏更大、形状不同的项 使用本机底部导航组件是否有一种非黑客方式来实现这一点?我猜不是因为它似乎不符合材料设计规范 否则,最好的方法是什么?我认为只有两种方法可以做到这一点,但在我看来没有一种是可靠的 对于每个“小项目”,在绘图顶部添加一个透明条,以达到相机图标的大小 在中间设置一个5个“底部项目”的底部栏,在上面我可以放置其他组件。这将要求该部件与底杆连接 编辑 这是我通过增加图标大小得到的,正如Harshit和Fmacaroni所建议的 未选择项

我正在尝试实现这个底部栏,它包含一个比其他栏更大、形状不同的项

使用本机底部导航组件是否有一种非黑客方式来实现这一点?我猜不是因为它似乎不符合材料设计规范

否则,最好的方法是什么?我认为只有两种方法可以做到这一点,但在我看来没有一种是可靠的

  • 对于每个“小项目”,在绘图顶部添加一个透明条,以达到相机图标的大小
  • 在中间设置一个5个“底部项目”的底部栏,在上面我可以放置其他组件。这将要求该部件与底杆连接
编辑

这是我通过增加图标大小得到的,正如Harshit和Fmacaroni所建议的

未选择项目时:

选择项目时:

赞成者:图标比其他图标大

缺点:它仍然包含在底部栏中。此外,选中此选项时,它不会垂直居中



可以通过编程方式更改底部栏导航中的图标大小

BottomNavigationView bottomNavigationView = (BottomNavigationView) 
activity.findViewById(R.id.bottom_navigation_view);

BottomNavigationMenuView menuView = (BottomNavigationMenuView) 
bottomNavigationView.getChildAt(0);

for (int i = 0; i < menuView.getChildCount(); i++) {
final View iconView = 
menuView.getChildAt(i).findViewById(android.support.design.R.id.icon);

final ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams();

final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
// set your height here
layoutParams.height = (int) 
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);

// set your width here
layoutParams.width = (int) 
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);

iconView.setLayoutParams(layoutParams);
}
BottomNavigationView BottomNavigationView=(BottomNavigationView)
activity.findViewById(R.id.bottom\u navigation\u view);
BottomNavigationMenuView菜单视图=(BottomNavigationMenuView)
bottomNavigationView.getChildAt(0);
对于(int i=0;i
我这样做是为了根据需要更改底部栏导航项的大小

以下是您可以做的:

  • 取一个与单击时要显示的图像大小相同的大图像,并将其存储在该可绘制文件夹中

  • 而不是在单击导航底部栏时应用该特定项目,而不是用较大的图像设置上一个较小的图像

  • 您可以查看使用此库来解决您的问题。

    作为参考,您可以迭代BottomNavigationView的每个子项,并更改指定项的大小:

    BottomNavigationView bottomNavigationView = (BottomNavigationView) activity.findViewById(R.id.bottom_navigation_view);
    BottomNavigationMenuView menuView = (BottomNavigationMenuView) bottomNavigationView.getChildAt(0);
    for (int i = 0; i < menuView.getChildCount(); i++) {
        final View iconView = menuView.getChildAt(i).findViewById(android.support.design.R.id.icon);
        final ViewGroup.LayoutParams layoutParams = iconView.getLayoutParams();
        final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        // If it is my special menu item change the size, otherwise take other size
        if (i == 2){
            // set your height here
            layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, displayMetrics);
            // set your width here
            layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, displayMetrics);
        }
        else {
            // set your height here
            layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
            // set your width here
            layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32, displayMetrics);
        }
        iconView.setLayoutParams(layoutParams);
    }
    
    BottomNavigationView BottomNavigationView=(BottomNavigationView)activity.findViewById(R.id.bottom\u navigation\u视图);
    BottomNavigationMenuView menuView=(BottomNavigationMenuView)bottomNavigationView.getChildAt(0);
    对于(int i=0;i
    经过几次研究后,我发现。他们没有提供我想要的,但是他们在他们的一个示例中实现了,这与我需要的非常接近

    这就是我通过重用他们的想法(仅在API 23上测试)得到的结果:


    自上次材料更新(2018年)以来,可以使用本机UI元素:

    • BottomAppBar
      带有
      app:fabAttached
      属性
    • FloatingActionButton
      与底部AppBar相关的
      app:layout\u锚定
    • 使用
      app:fabAlignmentMode

    您可以联系以获取更多新材质元素和有关此元素的更多详细信息


    希望它能帮助你

    最简单的方法是使用setScaleX和setScaleY。例如:

    final View iconView = 
    menuView.getChildAt(2).findViewById(android.support.design.R.id.icon);
    iconView.setScaleY(1.5f);
    iconView.setScaleX(1.5f);
    
    
    

    还要将android:clipChildren=“false”添加到根布局

    您想要一个库,还是只需要代码来更改项目的大小?@HarshitAgrawal如果已经有一个库能够做到这一点,那将是完美的,否则,我正在寻找最干净的编码方法。请看下面我的答案,我正在键入一个代码:)检查@Louis OK Louis let methink@Louis看看我编辑过的答案。希望这个图书馆对你有所帮助。请务必让我知道进一步的问题。如果这有助于您接受此问题的答案,以便其他前来寻找相同问题的用户也能得到帮助。:)我想用另一种方法来解决你的问题。首先让我知道这个库的反馈是否解决了问题。我看了一下,但没有发现任何对我的用例有用的东西,无论如何,谢谢!不能像BottomNavigationView使用BottomAppBar那样定位项目。它将作为选项的工具栏,而不是导航组件。这不是一个解决方案,答案不能回答问题。菜单项不显示
    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_alignParentBottom="true"
        android:background="?android:attr/windowBackground"
        app:itemIconTint="@color/colorPrimary"
        app:itemTextColor="@android:color/black"
        app:menu="@menu/navigation"
        android:clipChildren="false">
    
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:layout_gravity="center"
            android:layout_marginBottom="8dp"
            app:elevation="6dp"
            android:scaleType="center" />
    </android.support.design.widget.BottomNavigationView>