Як встановити непрозорість (альфа) для перегляду в 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), але це призвело до помилки.

Відповіді:


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;
  }
}

12
Дякую, це теж мені допомогло. Однак смішно, що TextView і ImageView мають різні способи встановлення альфа.
Джеральдо Насіменто

Це також допомогло мені застосувати ефект натискання на перегляд зображення без другого ресурсу. Дякую !!
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" />
Jonny

2
Перегляд не має android:colorатрибута.
Ронні

6
@moshersan Ви можете встановити колір у андроїд: власне фоновому режимі!
Dheeraj Bhaskar

1
Це невірна backgroundнепрозорість не viewнепрозорість. Не еквівалент у багатьох випадках використання
Jocky Doe

215

Я думаю, ви вже знайшли відповідь, але якщо ні (і для інших розробників), ви можете це зробити так:

btnMybutton.getBackground().setAlpha(45);

Тут я встановив непрозорість на 45. В основному ви можете встановити його від будь-якого від 0 (повністю прозорий) до 255 (повністю непрозорий)


5
Це доступно лише для API 11+ developer.android.com/reference/android/view/…
Graeme

8
@Graeme ви пов’язали метод setAlpha для класу View, але в публікації використовується setAlpha для класу Dravable. Метод getBackground повертає Dravable. Цей метод з API рівня 1. developer.android.com/reference/android/graphics/dravable/…
Geekygecko

О цікаво! Я цього не бачив. Чи означає це, що текст був повністю видимий, навіть якщо фон був встановлений прозорим.
Graeme

-1 це не працює в моєму випадку, коли моє фонове малювання є селектором.
Майк S

3
це чудово, але з одним побічним ефектом: у мене багато кнопок, що мають однаковий фон, і вони стають все прозорими! :(
Марк

66

Я б вам запропонував зробити це створити нестандартний колір ARGB у вашому файлі color.xml, наприклад:

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

потім встановіть фон кнопки на цей колір:

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

Ще одна річ, яку ви можете зробити, якщо хочете пограти з формою кнопки, - це створити ресурс, що малюється Shape де ви встановите властивості, як повинна виглядати кнопка:

файл: res / dravable / 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"

6
Якщо ви намагаєтесь приховати від непрозорості 40% до шістнадцяткової величини, ви можете скористатися пошуковим
запитом

54

Згідно з андроїдними документами view alfa - це значення від 0 до 1. Отже, щоб встановити його, використовуйте щось подібне:

View v;
v.setAlpha(.5f);

Це те, що працювало на мене лише для цілого перегляду ... Я спробував на елементі перегляду списку, який також має кілька текстових переглядів. цей єдиний рядок допоміг встановити альфа на перегляд та його дітей. Дякуємо @ cange1
Alyas

Єдине, що працювало і для мене. Я знаю, що це старе, але дякую @ 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) .


Привіт Йоснідхін. Дякую за відповідь Але це робить цілу кнопку повністю прозорою. Що я дивлюся, це нанести деяку непрозорість (можливо, через альфа-значення) на кнопку.
ncakmak

Це поплавок, тому ви можете використовувати значення, наприклад, 0 і 1, 0,5.
StackOverflowed

@StackOverflowed - я вважаю, ncakmak мав на увазі перше рішення. Якщо встановити @android:color/transparentяк Фон, дійсно зробить погляд повністю прозорим. Частина @android:alpha- здається, є доповненням.
катценхут

17

Хоча btnMybutton.getBackground().setAlpha(45);це приємна ідея, вона просто застосовує альфа до фону, а не до всього виду.

Якщо ви хочете застосувати альфа для перегляду використання btnMybutton.setAlpha(0.30f); замість цього. Це застосує непрозорість до View. Він приймає значення між 0 і 1.

Док каже:

Встановлює непрозорість перегляду. Це значення від 0 до 1, де 0 означає, що вигляд є повністю прозорим, а 1 означає, що вигляд є абсолютно непрозорим. Якщо цей погляд переглядає onSetAlpha (int), щоб повернути істину, то цей погляд відповідає за застосування непрозорості. В іншому випадку виклик цього методу еквівалентний виклику setLayerType (int, android.graphics.Paint) та встановленню апаратного рівня. Зауважте, що встановлення альфи на напівпрозоре значення (0 <альфа <1) може мати наслідки для продуктивності. Як правило, найкраще використовувати властивість альфа економно та швидко, як у випадку із завмиранням анімації.


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 + і налаштувати або виключити його для пряників / соти, тому що їх розміри нативного зображення кнопки відрізняються від ICS та JB (наприклад, цей точний стиль за кнопкою Пряники приводить до білого бітка під кнопкою).


7

Для перегляду можна встановити непрозорість наступним чином.

view_name.setAlpha(float_value);

Властивість view.setAlpha(int)застаріла для версії API, що перевищує 11. Відтепер властивість на зразок .setAlpha(0.5f)використовується.


6

Для API <11 для кольору textView я зробив наступне:

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

Трохи громіздкий, але ей, це працює :-)


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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.