【问题标题】:How can I apply an alpha mask to an Android drawable?如何将 alpha 蒙版应用于 Android 可绘制对象?
【发布时间】:2016-04-25 02:18:11
【问题描述】:

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

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

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

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

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

有人知道怎么做吗?


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

【问题讨论】:

  • 我不太听从你的解释。为清楚起见,您能否生成设备上显示的按钮图像?
  • @Karakuri,我添加了另一个示例,概述了按钮边框并使背景变为非白色。这是否有助于解释预期的结果?它仍然在 Inkscape 中模拟,因为我还没有弄清楚如何在 Android 中做到这一点:)
  • 只是一个想法,但创建自己的 View 子类可能更容易,它采用颜色并使用 Paint 对象自己绘制 6 个条形。关于 Android 视图的一个肮脏的小秘密:任何视图都可以被点击(所以你实际上不需要Button ...除非你也想要那里的文本,那么也许你确实需要Button)。跨度>

标签: android android-drawable android-button android-vectordrawable


【解决方案1】:

//这会有所帮助。

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);

【讨论】:

  • 谢谢史蒂文。我找到了一种达到预期效果的方法,刚刚发布了我的答案。恐怕我不能完全效仿你的榜样。
  • 没关系。有很多方法可以做到这一点。所以,抓住对你有帮助的代码。
【解决方案2】:

所以,我想出了如何做到这一点,尽管没有使用 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 以便显示所有条纹,而不管特定显示器上按钮的大小。

它是这样的:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多