Android 着色菜单图标
我正在构建一个Android应用程序,我使用动作栏图标包中的图标在动作栏中使用。我通过Android 着色菜单图标,android,xml,menu,Android,Xml,Menu,我正在构建一个Android应用程序,我使用动作栏图标包中的图标在动作栏中使用。我通过菜单文件夹中的xml文件定义它们。 有没有办法“着色”这些图标,使它们都是相同的颜色? 到目前为止,我必须用一个图像编辑软件手动完成,但是如果我决定改变颜色,我必须重新进行 我知道ImageView有一个android:tint属性,但我还没有找到一种方法将其用于菜单图标 谢谢也许有更好的方法可以做到这一点,但有一个选择是在代码中重新绘制图标 假设您有一个“收藏夹”菜单项,并希望将其着色为灰色: MenuIte
菜单
文件夹中的xml文件定义它们。
有没有办法“着色”这些图标,使它们都是相同的颜色?
到目前为止,我必须用一个图像编辑软件手动完成,但是如果我决定改变颜色,我必须重新进行
我知道ImageView
有一个android:tint
属性,但我还没有找到一种方法将其用于菜单图标
谢谢也许有更好的方法可以做到这一点,但有一个选择是在代码中重新绘制图标 假设您有一个“收藏夹”菜单项,并希望将其着色为灰色:
MenuItem-favoriteItem=menu.findItem(R.id.action\u-favorite);
Drawable newIcon=(Drawable)favoriteItem.getIcon();
setColorFilter(Color.argb(255,200,200,200),PorterDuff.Mode.SRC_-IN);
favoriteItem.setIcon(新图标);
您还可以使用颜色资源,如
newIcon.mutate().setColorFilter(getResources().getColor(R.color.myCustomTint),PorterDuff.Mode.SRC_-IN);
现在,您可以使用DrawableCompat
中的着色,而不是使用滤色器:
MenuItem-favoriteItem=menu.findItem(R.id.action\u-favorite);
Drawable favoriteIcon=DrawableCompat.wrap(favoriteItem.getIcon());
ColorStateList colorSelector=ResourcesCompat.getColorStateList(getResources(),R.color.tinted_选择器,getTheme());
DrawableCompat.setTintList(收藏夹图标、颜色选择器);
favoriteItem.setIcon(favoriteIcon);
如果图标的原始来源是光栅图像,则可以通过
对其进行包装
将此文件添加到drawable文件夹-settings_icon.xml中:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_action_settings"
android:tint="@color/colorRed"/>
然后使用此可绘制菜单项:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/new_game"
android:icon="@drawable/settings_icon"
android:title="@string/settings"
app:showAsAction="always"/>
</menu>
为了提高性能,您可以在utils类中创建一个静态方法,并随时使用该方法 --------定义你的方法-----------------------------------
public static void tintMenuIcon(Context context, MenuItem item, @ColorRes int color) {
Drawable normalDrawable = item.getIcon();
Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable);
DrawableCompat.setTint(wrapDrawable, context.getResources().getColor(color));
item.setIcon(wrapDrawable);
}
Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem menuItem = menu.findItem(R.id.action_delete);
if (menuItem != null) {
tintMenuIcon(MainActivity.this, menuItem, android.R.color.holo_purple);//HERE
}
return true;
}
---------------------如何使用它-------------------------------
public static void tintMenuIcon(Context context, MenuItem item, @ColorRes int color) {
Drawable normalDrawable = item.getIcon();
Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable);
DrawableCompat.setTint(wrapDrawable, context.getResources().getColor(color));
item.setIcon(wrapDrawable);
}
Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem menuItem = menu.findItem(R.id.action_delete);
if (menuItem != null) {
tintMenuIcon(MainActivity.this, menuItem, android.R.color.holo_purple);//HERE
}
return true;
}
我的来源是:例如,是否可以为
项
xml标记创建一个属性,例如iconTint
属性,并以编程方式在相应的绘图表上应用setColorFilter?很难相信不可能用一个方法调用/样式属性为所有工具栏图标着色。必须迭代每个图标不是很好。合理的解决方案。这是静态菜单项的干净解决方案。