A.Quiroga
A.Quiroga

Reputation: 5720

Is there a way to set drawable's Alpha using XML?

Easy like itself . I wanna make an alpha button , which would have a selected drawable this way:

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

I would wanna make something like this:

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

Thanks for all .

Upvotes: 56

Views: 81592

Answers (9)

Prashant
Prashant

Reputation: 557

I achieved the same using a drawable

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

Over here used the alpha 50, which sets the opacity level.

Upvotes: 52

Renetik
Renetik

Reputation: 6373

Its not that simple but its possible:

First you have to define color in color folder of your resources like this:

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>

Now you can reference that color from some shape:

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>

Tha you can use it in 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>

Upvotes: 1

Fernando Silva
Fernando Silva

Reputation: 111

I agree with Kasium sugest, so for some Android versions the especification to Alpha is in percent.

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

Upvotes: 2

daniellovessushi
daniellovessushi

Reputation: 56

I'm using the following for a custom radio button which should be diagonally strikethrough when it is disabled.

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: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>

Upvotes: 1

Kasium
Kasium

Reputation: 996

It's been a while since the OP, but personally found a solution that worked a lot better for me than the suggested answers. Creating a BitmapDrawable makes is easily possible to set the 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 can be any value between 0 and 255. Note that it is sort of the inverse of the HEX color value alpha, as for example 70% alpha would be B3 in HEX and 77 in the BitmapDrawable.

Upvotes: 57

Richard Sahlin
Richard Sahlin

Reputation: 131

My goal was to make a button have it's selected and pressed states at a different alpha - but using the same (png) resource and affecting as few files as possible.

My solution is similar to altering the alpha in a BitmapDrawable - but it does it from the selector so only one file is affected.

Use the tint function of Bitmap, remember that the tint will color the existing pixels so use a white color. Eg, #80FFFFFF - to keep color as original but reduce alpha by 50% This could also be used to change color of the icon when pressed.

This is my drawable XML file:

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

Upvotes: 5

Fredrik Metcalf
Fredrik Metcalf

Reputation: 307

I have been looking for the same thing. Even though this is posted over four years ago, this is the top post when googling the issue, so I'll reply here.

This is my solution

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

Upvotes: 20

kikettas
kikettas

Reputation: 1742

For those who have the same problem as OP, AppCompat now allows you to set 'alpha' parameter, as he wished in his target code:

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

More info here.

Upvotes: 16

android developer
android developer

Reputation: 116060

i think you could create your own drawable which could take this argument as a parameter. i've never done such a thing though.

check out this link :

How to set alpha value for drawable in a StateListDrawable?

if that's not possible, you can always do it in code...

here are 2 links i've found about it, in case you wish to use bitmaps instead:

Upvotes: 0

Related Questions