菜单项。颜色过滤器。圆形背景

MenuItem. ColorFilter. Rounded background

我为 MenuItem 使用矢量可绘制对象。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    menu.add(Menu.NONE, 1, Menu.NONE, "Pen")
            .setIcon(R.drawable.ic_pen)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    return true;
}

我有可变变量"color"。 对于 Android version >= Lollipop 我使用 setTin(color)

menuItem.getIcon().setTint(color);

对于 Android <= Lollipop 我想使用 setColorFilter(color, PorterDuff.Mode.SCREEN)。原来是这样的背景(正方形)

menuItem.setColorFilter(color, PorterDuff.Mode.SCREEN);

如何使这个背景变圆?

您可以使用 layer-list 创建 DrawableResource。为了使背景变圆创建新的 DrawableResource,我们将其命名为 ic_pen_rounded 并将下一个代码放入此文件中:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval">
            <solid android:color="#8df"/>
            <size
                android:width="100dp"
                android:height="100dp" />
        </shape>
    </item>
    <item android:drawable="@drawable/ic_pen" />
</layer-list>

然后在创建 MenuItem 时使用这个 Drawable:

menu.add(Menu.NONE, 1, Menu.NONE, "Pen")
        .setIcon(R.drawable.ic_pen_round)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

而且您还可以删除设置 VectorDrawable:

背景的行
  • menuItem.getIcon().setTint(color);
  • menuItem.setColorFilter(color, PorterDuff.Mode.SCREEN);

您可以在 ic_pen_rounded.xml 中设置图标背景,在下一行:

<solid android:color="#8df"/>

这是我的结果:



更新 - 如何在运行时更改图标背景颜色

  1. id 添加到 ShapeDrawablelayer-list:

    <item
        android:id="@+id/background">
        <shape android:shape="oval">
            <solid android:color="#8df"/>
            <size
                android:width="100dp"
                android:height="100dp" />
        </shape>
    </item>
    
  2. 获取menuItem图标:

    LayerDrawable layerDrawable = (LayerDrawable) menuItem.getIcon();
    
  3. 通过id查找背景item并设置颜色:

    GradientDrawable icon = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.background);
    icon.setColor(Color.RED);