如何将 alpha 遮罩应用于 Android 可绘制对象?

How can I apply an alpha mask to an Android drawable?

在我的应用程序中,我需要更改按钮的背景颜色以响应某些事件。通过设置创建可绘制对象、设置其绘制并将该可绘制对象用作按钮背景,效果很好:

    ShapeDrawable drawable = new ShapeDrawable(roundRectShape);
    drawable.getPaint().setColor(color);
    b.setBackground(drawable);

现在,我想在该可绘制对象上叠加一个 alpha 蒙版,创建一个 "striped" 按钮。这是蓝色和黑色按钮的外观(假设白色为背景色,但这些部分实际上应该是 100% 透明的):

我在 Inkscape 中制作了这个 alpha 蒙版,并成功将其导入为矢量资产。我可能需要将其转换为某种位图,但我不确定。

我已经阅读了很多文章和 SO 问题,提到了要应用的 PorterDuff 矩阵,但无法将这些转化为解决我当前的问题。

有人知道怎么做吗?


这是另一个可视化效果,希望能让事情更清楚。按钮父视图的背景颜色这里是淡粉色,按钮边框用红色勾勒(但在最终产品中应该是真的不可见):

//这会有所帮助。

ImageView img = (ImageView) findViewById(R.drawable.yourimage);

img.setAlpha(100);

//透明度在0到255之间; //如果要使用Bitmap

Bitmap b = BitmapFactory.decodeResources(getResources(), R.drawable.yourimage);

img.setImageBitmap(b);

img.setAlpha(100);

所以,我想出了如何做到这一点,尽管没有使用 SVG - 那里的问题太多了。

首先,我从使用 Button 切换到 ImageButton。然后我应用了以下样式:

<style name="stripedButton">
    <item name="android:layout_gravity">left</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:stateListAnimator">@null</item>
    <item name="android:clickable">true</item>
    <item name="android:elevation">0dp</item>
    <item name="android:longClickable">true</item>
    <item name="layout_widthPercent">70%</item>
    <item name="android:src">@drawable/fade_in_bars</item>
    <item name="android:tint">@color/RED</item>
    <item name="android:background">@null</item>
    <!-- Stretch image to fill entire button. -->
    <item name="android:scaleType">fitXY</item>
</style>

fade_in_bars 只是原始问题中显示的 alpha 蒙版的 png 版本。颜色可以在 XML 中设置或使用 tint 属性以编程方式设置。我不太明白为什么我需要将背景设置为空,但否则看起来很奇怪。最后,需要将 scaleType 设置为 fitXY,以便显示所有条纹,而不管特定显示器上按钮的大小如何。

这是它的样子: