菜单项。 ColorFilter。圆形背景

时间:2018-02-28 09:38:03

标签: android menu menuitem android-vectordrawable

我使用vector drawable for 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版本> = Lollipop我使用setTin(颜色)

menuItem.getIcon().setTint(color);

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

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

enter image description here

如何使这个背景四舍五入?

1 个答案:

答案 0 :(得分:0)

您可以使用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>

然后在创建Drawable时使用此MenuItem

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"/>

这是我的结果:

enter image description here



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

  1. id添加到ShapeDrawable内的layer-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);