菜单项。颜色过滤器。圆形背景
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"/>
这是我的结果:
更新 - 如何在运行时更改图标背景颜色
将 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>
获取menuItem
图标:
LayerDrawable layerDrawable = (LayerDrawable) menuItem.getIcon();
通过id查找背景item
并设置颜色:
GradientDrawable icon = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.background);
icon.setColor(Color.RED);
我为 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"/>
这是我的结果:
更新 - 如何在运行时更改图标背景颜色
将
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>
获取
menuItem
图标:LayerDrawable layerDrawable = (LayerDrawable) menuItem.getIcon();
通过id查找背景
item
并设置颜色:GradientDrawable icon = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.background); icon.setColor(Color.RED);