有没有一种使用XML设置drawable透明度的方法?

56

像本身一样简单。我想制作一个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>

感谢大家的支持。


我也还在努力弄清楚这个问题。你有什么进展吗? - lostintranslation
在您的布局XML中将XxxView替换为AppCompatXxxView,并遵循@kikettas的建议:https://dev59.com/92sz5IYBdhLWcg3wADEl#37947545 - Garry Dias
9个回答

57

距离 OP 已经有一段时间了,但我个人找到了一个比建议答案更好的解决方案。创建一个 BitmapDrawable 可以很容易地设置透明度:

<?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。


19
XML中的“alpha”实际上是浮点类型,其值应介于0.0和1.0之间。 - liuyong
4
可能对于视图而言这是正确的,但对于位图不是。设置“alpha”值的能力是一项目前未记录的功能,可能有效,也可能无效。该值也不是传统意义上的alpha值,而是它的相反值——不透明度,这就是为什么——如果它确实有效——你会在alpha值为255时得到完全透明的位图,在alpha值为0时得到完全不透明的位图的原因。 - sfera
@sfera 那么有没有在XML中实现这个的方法,还是我们没办法了? - lostintranslation
@liuyong 就 Android 文档而言,我想我们运气不太好。未记录的 alpha 属性似乎在 Android 5+ 上有效,但如果要支持早期版本,则无济于事。您可以生成透明资源或尝试使用图标字体。将位图包装在 NinePatch 中似乎也适用于 Android 5+,但我还没有在早期版本上进行测试。如果您找到其他选项,请告诉我。 - sfera
仅供参考,在Android Studio 2.0预览版2中,IDE明确要求我设置浮点值(即在0.0和1.0之间,正如@liuyong所解释的)。其他任何内容都会被标记为错误。 - Lampione
3
仅适用于实际图像,不包括任何Drawable(例如颜色)。 - TWiStErRob

52

我使用一个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,它设置了不透明度级别。


这非常有用。将其与图层列表和自己的可绘制项结合使用,可以创建一个按下状态的可绘制对象。 - Robert
2
我没明白,它怎么改变可绘制对象的 alpha 值? - M. Usman Khan
4
十六进制值表示成一对一对的。前两位代表 alpha 值(在 Android 中是这样,但有时也可能是最后两位)。接下来的三对分别代表红色、蓝色和绿色。alpha 值为 50,红色值为 00,蓝色值为 dd,绿色值为 ff。``` - dblackker
1
很遗憾,这并没有回答OP的问题,OP的问题是关于更改drawable的alpha而不是颜色。 - Mickäel A.
3
回答是正确的,但十六进制中50%的alpha值为256/2 = 128,因此为**#80**。 - longi
有时在Android API 21设备上,这个功能无法正常工作。已在类似的模拟器上进行了检查。有什么解决方法? - sanjeeb

20

我一直在寻找同样的东西。尽管这篇文章已经发表了四年,但当我搜索这个问题时,它仍然是排名最高的帖子,所以我会在这里回复。

这是我的解决方案。

<?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)。 - Monish Kamble
1
在将 state_selected 更改为 state_pressed 后,它成功运行。 - Monish Kamble
是的,那应该是正常情况,但我使用了问题中的示例代码。 - Fredrik Metcalf

16

对于那些和原帖作者有相同问题的人,现在AppCompat允许你在目标代码中设置'alpha'参数,就像他所希望的那样:

对于有类似问题的人,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>

更多信息请点击这里


4
从 API 23 开始,项可以选择定义一个 android:alpha 属性。 - John Ward
1
这只是针对颜色而不是可绘制对象吗? - Matt Wolfe
1
这里的 alpha 值不应该在 0 到 1 的范围内吗? - YTerle

5
我的目标是使一个按钮在选中和按下状态下有不同的alpha值,但只使用相同的(png)资源文件并尽可能少地影响文件。
我的解决方案类似于更改BitmapDrawable中的alpha值,但它是从选择器中实现的,因此只影响一个文件。
使用Bitmap的tint函数,记住tint会给现有像素上色,所以使用白色。 例如,#80FFFFFF - 保持颜色原始但将alpha减少50% 这也可以用于在按下时更改图标的颜色。
以下是我的drawable 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>

1

这并不是那么简单,但是确实可行:

首先,您必须在资源的颜色文件夹中定义颜色,就像这样:

color/inst_control_pressed_transp.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:alpha="0.5" android:color="?attr/inst_control_pressed" />
</selector>

现在你可以从某个形状引用那个颜色了。

drawable/background_clear_pressed.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid
        android:color="@color/inst_control_pressed_transp" />
</shape>

你可以将它用于drawable中:

drawable/background_bordered_clear_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/background_clear_pressed" android:state_pressed="true" android:state_selected="false" />
    <item android:drawable="@drawable/background_clear_active" android:state_activated="true" />
    <item android:drawable="@drawable/background_clear_selected" android:state_selected="true" />
    <item android:drawable="@drawable/background_bordered_clear_round" />
</selector>

1

我同意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>

1
我正在使用以下内容来创建自定义单选按钮,当其被禁用时应该斜划线删除。

5个单选按钮的示例图像,其中有4个已启用

  <item android:state_enabled="false">
    <layer-list>
      <item>
        <shape android:shape="rectangle">
          <size
              android:height="35dp"
              android:width="35dp"/>
          <stroke
              android:color="@color/someGrey"
              android:width="1dp"/>
          <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:width="1dp"/>
          </shape>
        </rotate>
      </item>
    </layer-list>
  </item>

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接