如何将 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,以便显示所有条纹,而不管特定显示器上按钮的大小如何。
这是它的样子:
在我的应用程序中,我需要更改按钮的背景颜色以响应某些事件。通过设置创建可绘制对象、设置其绘制并将该可绘制对象用作按钮背景,效果很好:
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,以便显示所有条纹,而不管特定显示器上按钮的大小如何。
这是它的样子: