Есть ли способ установить альфа Drawable, используя XML? - PullRequest
46 голосов
/ 18 ноября 2011

Легко, как сам по себе. Я хочу сделать альфа-кнопку, которая будет иметь выбранный рисунок таким образом:

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

Спасибо за все.

Ответы [ 9 ]

50 голосов
/ 16 марта 2015

Прошло много времени с ОП, но лично я нашел решение, которое работало для меня намного лучше, чем предлагаемые ответы.Создание 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>

Альфа может принимать любое значение в диапазоне от 0 до 255. Обратите внимание, что это своего рода инверсия значения цвета HEX.альфа, например 70% альфа будет B3 в HEX и 77 в BitmapDrawable.

42 голосов
/ 25 августа 2013

Я добился того же, используя Drawable

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

Здесь используется альфа 50, который устанавливает уровень непрозрачности. Надеюсь, это поможет

15 голосов
/ 22 апреля 2016

Я искал то же самое. Несмотря на то, что это сообщение было опубликовано более четырех лет назад, это самая популярная статья, посвященная поиску проблемы, поэтому я отвечу здесь.

Это мое решение

<?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>
10 голосов
/ 21 июня 2016

Для тех, у кого та же проблема, что и у OP, AppCompat теперь позволяет вам установить параметр «альфа», как он хотел в своем целевом коде:

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

Подробнее здесь .

9 голосов
/ 18 ноября 2011

Я не думаю, что есть способ сделать это.Существует атрибут android:alpha, но он применяется к представлениям, а не к объектам рисования.Он доступен только с уровня API 11.

3 голосов
/ 18 января 2017

Моей целью было сделать так, чтобы у кнопки были выбранные и нажатые состояния на другом альфа-канале, но с использованием одного и того же (png) ресурса и влиянием на как можно меньше файлов.

Мое решение аналогично изменению альфы в BitmapDrawable - но оно делает это с помощью селектора, поэтому затрагивается только один файл.

Используйте функцию оттенка Bitmap, помните, что оттенок будет окрашивать существующие пиксели, поэтому используйте белый цвет. Например, # 80FFFFFF - сохранить цвет как оригинальный, но уменьшить альфа на 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>
1 голос
/ 16 мая 2019

Я использую следующее для пользовательского переключателя, который должен быть зачеркнут по диагонали, когда он отключен.

Пример изображения из 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 голосов
/ 30 июня 2019

Я согласен с Kasium sugest, поэтому для некоторых версий 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>
0 голосов
/ 25 августа 2013

Я думаю, вы могли бы создать свой собственный объект рисования, который мог бы принять этот аргумент в качестве параметра.Я никогда не делал ничего подобного.

проверить эту ссылку:

Как установить альфа-значение для рисования в StateListDrawable?

, если это невозможно, вы всегда можете сделать этов коде ...

вот 2 ссылки, которые я нашел об этом, на случай, если вы захотите использовать вместо них растровые изображения:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...