有没有办法使用 XML 设置可绘制的 Alpha?

Posted

技术标签:

【中文标题】有没有办法使用 XML 设置可绘制的 Alpha?【英文标题】:Is there a way to set drawable's Alpha using XML? 【发布时间】:2012-01-01 00:43:03 【问题描述】:

像它自己一样容易。我想制作一个 alpha 按钮,它会以这种方式具有选定的可绘制对象:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Play/Pause -->
    <item android:state_selected="false" android:drawable="@drawable/item" />
    <item android:state_selected="true" android:drawable="@drawable/item" />

</selector>

我想做这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Play/Pause -->
    <item android:alpha="125" android:state_selected="false" android:drawable="@drawable/item" />
    <item android:alpha="255" android:state_selected="true" android:drawable="@drawable/item" />

</selector>

谢谢大家。

【问题讨论】:

我还在努力解决这个问题。运气好吗? 在您的布局 XML 中将 XxxView 替换为 AppCompatXxxView 并遵循 @kikettas 的建议:***.com/a/37947545/3810036 【参考方案1】:

自 OP 以来已经有一段时间了,但我个人发现了一个比建议的答案对我来说效果更好的解决方案。创建 BitmapDrawable 使得设置 alpha 变得很容易:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/your_drawble"
    android:alpha="77">
</bitmap>

Alpha 可以是 0 到 255 之间的任何值。请注意,它是 HEX 颜色值 alpha 的倒数,例如 70% 的 alpha 在 HEX 中是 B3,在 BitmapDrawable 中是 77。

【讨论】:

其实,xml中的alpha是float类型的,应该是0.0到1.0之间的值。 @liuyong 对于视图来说可能是这样,但对于&lt;bitmap&gt; 则不然。设置&lt;bitmap&gt; 的“alpha”的能力是当前未记录的功能,它可能有效也可能无效。该值也并不真正代表传统意义上的 alpha 值,而是它的对立面,即不透明度,这就是为什么 - 如果它恰好工作 - 你会得到一个完全透明的位图,其值为 255 和完全不透明度值为 0。 @sfera 那么有没有办法在 XML 中做到这一点,还是我们不走运? @liuyong 就 Android 文档而言,我想我们不走运。未记录的 alpha 属性似乎适用于 Android 5+,但如果想要支持早期版本,那将无济于事。您可以生成透明资源或尝试使用图标字体。将位图包装在 NinePatch 中似乎也适用于 Android 5+,但我没有在早期版本上测试过。如果您找到其他选择,请告诉。 这仅适用于实际图像,不适用于任何可绘制对象(例如颜色)。【参考方案2】:

我使用drawable实现了同样的效果

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="#5000ddff" />
</shape>

这里使用了 alpha 50,它设置了不透明度级别。 希望有帮助

【讨论】:

这很有用。将此与图层列表和您自己的可绘制项目结合使用可以为按下状态创建可绘制对象。 我没明白,它是如何改变drawable的alpha的? 十六进制值是成对描述的。前 2 个代表 alpha(无论如何对于 Android,有时它是最后 2 个)。接下来的 3 对代表 Red - Blue - Green #5000ddff alpha(50) red(00) blue(dd) green(ff) 不幸的是,这没有回答 OP,它是关于更改 drawable 的 alpha,而不是颜色。 答案是正确的,但 50% 的十六进制 alpha 为 256/2 = 128,因此 #80【参考方案3】:

我一直在寻找同样的东西。尽管这是四年前发布的,但这是谷歌搜索问题时的热门帖子,所以我会在这里回复。

这是我的解决方案

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false">
        <bitmap android:alpha="@integer/not_pressed_alpha" android:src="@drawable/item"/>
    </item>
    <item android:state_pressed="true" android:drawable="@drawable/item" />
</selector>

【讨论】:

我试过这个。不为我工作。在模拟器上测试(Nexus 5X API 23)。 state_selected 更改为state_pressed 后有效。 是的,这是正常情况,但我使用了问题中的示例代码。【参考方案4】:

对于那些与 OP 有同样问题的人,AppCompat 现在允许您设置 'alpha' 参数,正如他在目标代码中所希望的那样:

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Play/Pause -->
    <item android:alpha="125" android:state_selected="false" android:drawable="@drawable/item" />
    <item android:alpha="255" android:state_selected="true" android:drawable="@drawable/item" />

</selector>

更多信息here。

【讨论】:

"从 API 23 开始,项目可以选择定义一个 android:alpha 属性" 这不只是为了颜色而不是drawables吗? 这里的alpha值不应该在0到1之间吗?【参考方案5】:

我的目标是让按钮在不同的 alpha 上具有选中和按下状态 - 但使用相同的 (png) 资源并影响尽可能少的文件。

我的解决方案类似于更改 BitmapDrawable 中的 alpha - 但它是通过选择器进行的,因此只有一个文件受到影响。

使用 Bitmap 的 tint 功能,请记住,tint 会为现有像素着色,因此请使用白色。 例如,#80FFFFFF - 保持颜色不变,但将 alpha 减少 50% 这也可以用于在按下时更改图标的颜色。

这是我的可绘制 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <bitmap
            android:src="@drawable/ic_camera"
            android:tint="#80FFFFFF">
        </bitmap>
    </item>
    <item android:state_pressed="true">
        <bitmap
            android:src="@drawable/ic_camera"
            android:tint="#80FFFFFF">
        </bitmap>
    </item>
    <item>
        <bitmap
            android:src="@drawable/ic_camera">
        </bitmap>
    </item>
</selector>

【讨论】:

【参考方案6】:

我正在使用以下自定义单选按钮,当它被禁用时,它应该是对角删除线。

Example Image of 5 radio buttons where 4 of them are enabled

  <item android:state_enabled="false">
    <layer-list>
      <item>
        <shape android:shape="rectangle">
          <size
              android:
              android:/>
          <stroke
              android:color="@color/someGrey"
              android:/>
          <corners android:radius="1dp"/>
        </shape>
      </item>
      <item>
        <rotate
            android:fromDegrees="135"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="135">
          <shape android:shape="line">
            <stroke
                android:color="@color/someGrey"
                android:/>
          </shape>
        </rotate>
      </item>
    </layer-list>
  </item>

【讨论】:

【参考方案7】:

我同意 Kasium 的建议,因此对于某些 Android 版本,Alpha 的规格以百分比表示。

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/your_drawble"
    android:alpha="0.5">
</bitmap>

【讨论】:

【参考方案8】:

我认为您可以创建自己的可绘制对象,该可绘制对象可以将此参数作为参数。我从来没有做过这样的事情。

查看此链接:

How to set alpha value for drawable in a StateListDrawable?

如果不可能,您可以随时在代码中完成...

这是我找到的 2 个链接,以防您希望使用位图:

https://plus.google.com/+RomanNurik/posts/FZQcNW8G75K https://gist.github.com/romannurik/5779875

【讨论】:

以上是关于有没有办法使用 XML 设置可绘制的 Alpha?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用xml中的可绘制形状绘制半椭圆形(Android)

如何将可绘制背景设置为仅将数字字符串转换为 android 中的另一个字符串?

如何将渐变可绘制设置为 FloatingActionButton 上的 backgroundTint 属性

使用复合可绘制对象在 TextView 中设置实际文本填充

我应该使用啥来获得更好的性能、九个补丁或可绘制的 xml 资源?

为绘制笔画设置混合模式?