Как установить непрозрачность (альфа) для просмотра в Android

211

У меня есть кнопка, как в следующем:

<Button 
     android:text="Submit" 
     android:id="@+id/Button01" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content">
</Button>

В моем onCreate()случае я звоню Button01 так:

setContentView(R.layout.main);

View Button01 = this.findViewById(R.id.Button01);
Button01.setOnClickListener(this);

В приложении есть фон, и я хочу установить непрозрачность для этой кнопки отправки. Как я могу установить непрозрачность для этого представления? Это то, что я могу установить на стороне Java, или я могу установить в файле main.xml?

На стороне Java я пытался Button01.mutate().SetAlpha(100), но это дало мне ошибку.

ncakmak
источник

Ответы:

64

Я только что нашел ваш вопрос, когда у меня была похожая проблема с TextView. Я смог решить ее, расширив TextView и переопределив onSetAlpha. Может быть, вы могли бы попробовать что-то подобное с вашей кнопкой:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

public class AlphaTextView extends TextView {

  public AlphaTextView(Context context) {
    super(context);
  }

  public AlphaTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public AlphaTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Override
  public boolean onSetAlpha(int alpha) {
    setTextColor(getTextColors().withAlpha(alpha));
    setHintTextColor(getHintTextColors().withAlpha(alpha));
    setLinkTextColor(getLinkTextColors().withAlpha(alpha));
    return true;
  }
}
Rotora
источник
12
Спасибо, это также помогло мне. Однако смешно, что TextView и ImageView имеют разные способы установки альфа.
Джеральдо Насименто
Это также помогло мне применить эффект клика к изображению без второго ресурса. Thanx !!
Skygeek
568

Я поражен тем , все остальные гораздо более сложных ответов.

XML

Вы можете очень просто определить альфа в определении цвета кнопки (или любого другого представления) в вашем xml:

android:color="#66FF0000"    // Partially transparent red

В приведенном выше примере цвет будет частично прозрачным красным.

При определении цвета представления формат может быть либо, #RRGGBBлибо #AARRGGBB, где AAэто шестнадцатеричное альфа-значение. FFбудет полностью непрозрачным и 00будет полностью прозрачным.

динамично

Если вам нужно динамически изменить прозрачность в вашем коде, используйте

myButton.getBackground().setAlpha(128);  // 50% transparent

Где INT варьируется от 0(полностью прозрачный) до 255(полностью непрозрачный).

Джейк Уилсон
источник
18
Это все еще не решение, если у вас есть составной чертеж
Michał K
6
Установить полупрозрачный зеленый цвет вида: <RelativeLayout android: background = "# 8700FF00" />
Джонни
2
Вид не имеет android:colorатрибута.
Ронни
6
@moshersan Вы можете установить цвет в самом свойстве android: background!
Дхирадж Бхаскар
1
Это неверная backgroundнепрозрачность, а не viewнепрозрачность. Не эквивалентен во многих случаях использования
Jocky Doe
215

Я думаю, вы, возможно, уже нашли ответ, но если нет (и для других разработчиков), вы можете сделать это так:

btnMybutton.getBackground().setAlpha(45);

Здесь я установил непрозрачность на 45. Вы можете установить ее от 0 (полностью прозрачный) до 255 (полностью непрозрачный).

абхи
источник
5
Это доступно только для API 11+ developer.android.com/reference/android/view/…
Грэм,
8
@ Grame, вы связались с методом setAlpha в классе View, но публикация использует setAlpha в классе Drawable. Метод getBackground возвращает Drawable. Этот метод из API уровня 1. developer.android.com/reference/android/graphics/drawable/…
Geekygecko
Ох, интересно! Я этого не видел. Означает ли это, что текст был полностью виден, даже если фон был прозрачным.
Грэм
-1 это не работает в моем случае, когда мой фон для рисования является селектором.
Майк С
3
это прекрасно работает, но с одним побочным эффектом: у меня много кнопок с общим фоном, и они становятся прозрачными! :(
Отметить
66

Я бы посоветовал вам создать собственный цвет ARGB в вашем файле colors.xml, например:

<resources>
<color name="translucent_black">#80000000</color>
</resources>

затем установите цвет фона кнопки:

android:background="@android:color/translucent_black"

Еще одна вещь, которую вы можете сделать, если вы хотите поиграть с формой кнопки, это создать ресурс рисования Shape, в котором вы устанавливаете свойства, как должна выглядеть кнопка:

файл: res / drawable / rounded_corner_box.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#80000000"
        android:endColor="#80FFFFFF"
        android:angle="45"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="8dp" />
</shape>

Затем используйте это как фон кнопки:

    android:background="@drawable/rounded_corner_box"
Akos Cz
источник
6
Если вы изо всех сил пытаетесь скрыть от 40% непрозрачности до шестнадцатеричного значения, вы можете использовать поиск в Google «40% от 255 до шестнадцатеричного», чтобы получить шестнадцатеричное значение для 40%
scottyab
54

В соответствии с представлением Android-документов альфа-версия имеет значение от 0 до 1. Поэтому, чтобы установить его, используйте что-то вроде этого:

View v;
v.setAlpha(.5f);
cange1
источник
Это то, что работало только для меня в целом виде ... Я попробовал элемент списка, который также имеет несколько текстовых просмотров. эта единственная строка помогла установить альфу на виду и ее дочерним элементам. Спасибо @ cange1
Аляс
Единственное, что сработало и для меня. Я знаю, что это старо, но спасибо @ cange1
masoftheund
50

Гораздо проще из вышесказанного. Для кнопки есть альфа-атрибут по умолчанию

android:alpha="0.5"

Диапазон между 0 для полной прозрачности и 1 для полной непрозрачности.

Раджа Джавахар
источник
Это именно то, что я искал, круто, проверено на API 21
Фернандо Торрес
Идеальный ответ !!
Гарри. Наем
18
android:background="@android:color/transparent"

Это то, что я знаю ... Я думаю, что создание пользовательского класса кнопки - лучшая идея

Уровень API 11
Недавно я столкнулся с этим атрибутом android: alpha xml, который принимает значение от 0 до 1. Соответствующий метод - setAlpha (float) .

Josnidhin
источник
Привет, Джоснидин. Спасибо за ваш ответ. Но это делает всю кнопку полностью прозрачной. То, что я смотрю, это наложение на кнопку некоторой непрозрачности (возможно, через альфа-значение).
ncakmak
Это число с плавающей запятой, поэтому вы можете использовать значения между 0 и 1, например, 0,5.
StackOverflowed
@StackOverflowed - я считаю, что ncakmak имел в виду первое решение. установка в @android:color/transparentкачестве фона действительно сделает вид полностью прозрачным. @android:alpha- часть , как представляется , добавление к нему.
Каценхут
17

Хотя btnMybutton.getBackground().setAlpha(45);это хорошая идея, он просто применяет альфу к фону, а не ко всему виду.

Если вы хотите применить альфа для просмотра использования btnMybutton.setAlpha(0.30f);вместо. Это применить непрозрачность для просмотра. Он принимает значение от 0 до 1.

Док говорит:

Устанавливает непрозрачность вида. Это значение от 0 до 1, где 0 означает, что вид полностью прозрачен, а 1 означает, что вид полностью непрозрачен. Если это представление переопределяет onSetAlpha (int) для возврата true, то это представление отвечает за применение самой прозрачности. В противном случае вызов этого метода эквивалентен вызову setLayerType (int, android.graphics.Paint) и установке аппаратного уровня. Обратите внимание, что установка альфа на полупрозрачное значение (0 <альфа <1) может повлиять на производительность. Как правило, лучше всего использовать свойство alpha экономно и временно, как в случае анимации с замиранием.

Hesam
источник
7

Я столкнулся с этой проблемой с ICS / JB, потому что кнопки по умолчанию для темы Holo состоят из изображений, которые немного прозрачны. Для фона это особенно заметно.

Пряники против ICS +:

Имбирный пряник ICS

Копировать все нарисованные состояния и изображения для каждого разрешения и делать прозрачные изображения сплошными, поэтому я выбрал более грязное решение: обернуть кнопку в держатель на белом фоне. Вот грубая отрисовка XML (ButtonHolder), которая делает именно это:

Ваш XML-файл

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              style="@style/Content">
  <RelativeLayout style="@style/ButtonHolder">
      <Button android:id="@+id/myButton"
              style="@style/Button"
              android:text="@string/proceed"/>
    </RelativeLayout>
</LinearLayout>

ButtonHolder.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <shape android:shape="rectangle">
      <solid android:color="@color/white"/>
    </shape>
  </item>

</layer-list>

styles.xml

.
.
.      
  <style name="ButtonHolder">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:background">@drawable/buttonholder</item>
  </style>

  <style name="Button" parent="@android:style/Widget.Button">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:textStyle">bold</item>
  </style>
.
.
.

Тем не менее, это приводит к появлению белой границы, потому что изображения кнопки Holo включают поля для учета нажатого пространства:

Слишком много белого Слишком много белого прессованного

Таким образом, решение состоит в том, чтобы дать белому фону поле (4dp сработало для меня) и закругленные углы (2dp), чтобы полностью скрыть белый цвет, но сделать кнопку сплошной:

ButtonHolder.xml

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

  <item>
    <shape android:shape="rectangle">
      <solid android:color="@android:color/transparent"/>
    </shape>
  </item>

  <item android:top="4dp" android:bottom="4dp" android:left="4dp" android:right="4dp">
    <shape android:shape="rectangle">
      <solid android:color="@color/white"/>
      <corners android:radius="2dp" />
    </shape>
  </item>

</layer-list>

Конечный результат выглядит так:

Нет белого Нет белого нажата

Вы должны выбрать этот стиль для v14 +, а также настроить или исключить его для Gingerbread / Honeycomb, потому что размеры их собственных кнопок отличаются от ICS и JB (например, этот точный стиль за кнопкой Gingerbread приводит к появлению небольшого белого цвета под кнопкой).

Энни
источник
7

Для просмотра вы можете установить прозрачность следующим образом.

view_name.setAlpha(float_value);

Свойство view.setAlpha(int)не рекомендуется для версии API больше 11. Отныне используется свойство like .setAlpha(0.5f).

Palash Dange
источник
6

Для API <11 для textView color я сделал следующее:

int textViewColor = textView.getTextColors().getDefaultColor(); 
textView.setTextColor(Color.argb(128, Color.red(textViewColor), Color.green(textViewColor), Color.blue(textViewColor))); //50% transparent

Немного громоздко, но эй, это работает :-)

EZDsIt
источник
1

Я знаю, что на это уже есть куча ответов, но я обнаружил, что для кнопок проще всего создать собственные селекторы .xml и установить их на фоне указанной кнопки. Таким образом, вы также можете изменить его состояние при нажатии или включении и так далее. Вот быстрый фрагмент того, который я использую. Если вы хотите добавить прозрачность к любому из цветов, добавьте начальное шестнадцатеричное значение (#XXcccccc). (XX == "Альфа цвета")

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#70c656" />
            <stroke
                android:width="1dp"
                android:color="#53933f" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#70c656"
                android:endColor="#53933f"
                android:angle="270" />
            <stroke
                android:width="1dp"
                android:color="#53933f" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>
Конрад Винковски
источник