【问题标题】:MenuItem. ColorFilter. Rounded background菜单项。颜色过滤器。圆形背景
【发布时间】:2018-02-28 09:38:03
【问题描述】:

我为 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;
}

我有可变变量“颜色”。 对于 Android 版本 >= Lollipop,我使用 setTin(color)

menuItem.getIcon().setTint(color);

对于 Android

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

如何让这个背景变圆?

【问题讨论】:

    标签: android menu menuitem android-vectordrawable


    【解决方案1】:

    您可以使用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 添加到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);
      

    【讨论】:

    • 我给了每个层列表项 id 并尝试像这样更改颜色:LayerDrawable layerDrawable = (LayerDrawable) ContextCompat.getDrawable(PhotoEditorActivity.this, R.drawable.ic_pen_rounded); GradientDrawable font = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.font_item); ont.setColor(color);Сolor 没有改变,如何以编程方式更改它?
    • @Interrobang 这是因为你得到了Drawable 资源更改它并没有设置。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2018-05-27
    相关资源
    最近更新 更多