Jak ustawić krycie (alfa) dla widoku w Androidzie


211

Mam przycisk jak poniżej:

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

W moim onCreate()przypadku dzwonię do Button01 w ten sposób:

setContentView(R.layout.main);

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

Aplikacja ma tło i chcę ustawić krycie tego przycisku przesyłania. Jak ustawić krycie dla tego widoku? Czy jest to coś, co mogę ustawić po stronie Java, czy mogę ustawić w pliku main.xml?

Po stronie java próbowałem Button01.mutate().SetAlpha(100), ale dał mi błąd.

Odpowiedzi:


64

Właśnie znalazłem twoje pytanie, mając podobny problem z TextView. Udało mi się to rozwiązać, rozszerzając TextView i zastępując onSetAlpha. Może możesz spróbować czegoś podobnego za pomocą przycisku:

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
Dzięki, to mi też pomogło. Jednak niedorzeczne jest to, że TextView i ImageView mają różne sposoby ustawiania alfa.
— Geraldo Nascimento

Pomogło mi to również do zastosowania efektu kliknięcia w widoku obrazu bez drugiego zasobu. Dzięki !!
— skygeek

568

Dziwi mnie DUŻO bardziej skomplikowane odpowiedzi.

XML

Możesz bardzo łatwo zdefiniować alfa w definicji koloru przycisku (lub dowolnego innego widoku) w swoim pliku xml:

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

W powyższym przykładzie kolor byłby częściowo przezroczystym czerwonym.

Podczas definiowania koloru widoku formatem może być albo, #RRGGBBalbo #AARRGGBB, gdzie AAjest wartość szesnastkowa alfa. FFbyłoby całkowicie nieprzejrzyste i 00całkowicie przejrzyste.

Dynamicznie

Jeśli chcesz dynamicznie zmieniać krycie w swoim kodzie, użyj

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

Gdzie INT waha się od 0(całkowicie przezroczysty) do 255(całkowicie nieprzezroczysty).


18
To wciąż nie jest rozwiązanie, jeśli masz złożony ciągnik
— Michał K

6
Ustaw pół przezroczysty zielony kolor widoku: <RelativeLayout android: background = "# 8700FF00" />
— Jonny

2
Widok nie ma android:coloratrybutu.
— Ronnie,

6
@moshersan Możesz ustawić kolor w Android: sama właściwość tła!
— Dheeraj Bhaskar

1
Niepoprawne backgroundkrycie nie jest viewkryciem. Nie jest równoważny w wielu przypadkach użycia
— Jocky Doe

215

Chyba już znalazłeś odpowiedź, ale jeśli nie (i dla innych programistów), możesz to zrobić w następujący sposób:

btnMybutton.getBackground().setAlpha(45);

Tutaj ustawiłem krycie na 45. Można go zasadniczo ustawić w zakresie od 0 (w pełni przezroczysty) do 255 (całkowicie nieprzezroczysty)


5
Jest to dostępne tylko w API 11+ developer.android.com/reference/android/view/...
— Graeme

8
@Graeme połączyłeś się z metodą setAlpha w klasie View, ale post używa setAlpha w klasie Drawable. Metoda getBackground zwraca Drawable. Ta metoda pochodzi z interfejsu API poziomu 1. developer.android.com/reference/android/graphics/drawable/…
— Geekygecko

Interesujące! Nie widziałem tego Czy to oznacza, że ​​tekst byłby w pełni widoczny, nawet jeśli tło było ustawione na przezroczyste.
— Graeme

-1 to nie działa w moim przypadku, gdy moje tło do rysowania jest selektorem.
— Mike S

3
działa to świetnie, ale z jednym efektem ubocznym: mam wiele przycisków o tym samym tle i wszystkie stają się przezroczyste! :(
— Mark

66

Sugeruję zrobienie niestandardowego koloru ARGB w pliku colours.xml, takiego jak:

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

następnie ustaw tło przycisku na ten kolor:

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

Inną rzeczą, którą możesz zrobić, jeśli chcesz bawić się kształtem przycisku, jest utworzenie zasobu z możliwością rysowania kształtu, w którym ustawiasz właściwości, jak powinien wyglądać przycisk:

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

Następnie użyj tego jako tła przycisku:

    android:background="@drawable/rounded_corner_box"

6
Jeśli próbujesz ukryć od 40% krycia do wartości heksadecymalnej, możesz użyć wyszukiwarki Google „40% z 255 na hex” daje wartość heksadecymalną dla 40%
— scottyab

54

Zgodnie z Android Docs widok alfa ma wartość od 0 do 1. Aby ustawić, użyj czegoś takiego:

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

To działało tylko dla mnie dla całego widoku ... Próbowałem na elemencie widoku listy, który ma również wiele widoków tekstu. ta pojedyncza linia pomogła ustawić alfa na widoku i jego potomkach. Thanks @ cange1
— Alyas,

Jedyne, co dla mnie zadziałało. Wiem, że to stare, ale dzięki @ cange1
— masoftheund

50

O wiele łatwiej z powyższego. Domyślny atrybut alfa znajduje się dla przycisku

android:alpha="0.5"

Zakres wynosi od 0 dla pełnego przezroczystości do 1 dla całkowitego krycia.


Właśnie tego szukałem, niesamowite, przetestowane na API 21
— Fernando Torres

Idealna odpowiedź !!
— Harry .Naeem

18
android:background="@android:color/transparent"

Powyżej jest coś, co wiem ... Myślę, że stworzenie niestandardowej klasy przycisków jest najlepszym pomysłem

Poziom API 11
Ostatnio natknąłem się na ten atrybut android: alpha xml, który przyjmuje wartość od 0 do 1. Odpowiednią metodą jest setAlpha (liczba zmiennoprzecinkowa) .


Cześć Josnidhin. Dziękuję za odpowiedź. Ale sprawia, że ​​cały przycisk jest całkowicie przezroczysty. To, czego szukam, to nałożenie krycia (może za pomocą wartości alfa) na przycisk.
— ncakmak

Jest to liczba zmiennoprzecinkowa, dzięki czemu można na przykład używać wartości MIĘDZY 0 i 1, 0,5.
— StackOverflow Flow

@StackOverflowed - wierzę, że ncakmak oznaczało pierwsze rozwiązanie. ustawienie @android:color/transparentjako Tło rzeczywiście sprawi, że widok będzie całkowicie przezroczysty. Ta @android:alphaczęść wydaje się być uzupełnieniem.
— katzenhut

17

Chociaż btnMybutton.getBackground().setAlpha(45);jest to dobry pomysł, po prostu stosuje alfa do tła, a nie do całego widoku.

Jeśli chcesz zastosować alfa, aby wyświetlić, użyj btnMybutton.setAlpha(0.30f);zamiast tego. Dotyczy to krycia w widoku. Przyjmuje wartość od 0 do 1.

Doc mówi:

Ustawia krycie widoku. Jest to wartość od 0 do 1, gdzie 0 oznacza widok całkowicie przezroczysty, a 1 oznacza widok całkowicie nieprzezroczysty. Jeśli ten widok przesłania onSetAlpha (int), aby zwrócić true, wówczas ten widok jest odpowiedzialny za zastosowanie samego krycia. W przeciwnym razie wywołanie tej metody jest równoważne z wywołaniem setLayerType (int, android.graphics.Paint) i ustawieniem warstwy sprzętowej. Należy pamiętać, że ustawienie wartości półprzezroczystej alfa (0 <alfa <1) może mieć wpływ na wydajność. Zasadniczo najlepiej jest używać właściwości alfa oszczędnie i przejściowo, tak jak w przypadku zanikających animacji.


7

Wystąpił ten problem z ICS / JB, ponieważ domyślne przyciski motywu Holo składają się z obrazów, które są nieco przezroczyste. W tle jest to szczególnie zauważalne.

Piernik vs. ICS +:

piernik ICS

Kopiowanie wszystkich możliwych do rysowania stanów i obrazów dla każdej rozdzielczości i utrwalanie przezroczystych obrazów jest uciążliwe, więc wybrałem brudniejsze rozwiązanie: zawiń przycisk w uchwycie, które ma białe tło. Oto prymitywny rysunek XML (ButtonHolder), który robi dokładnie to:

Twój plik 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>
.
.
.

Powoduje to jednak powstanie białej ramki, ponieważ obrazy przycisku Holo zawierają marginesy uwzględniające naciśnięcie spacji:

Za dużo bieli Tłoczona zbyt duża ilość bieli

Rozwiązaniem jest więc nadanie białemu tłu marginesu (4 dp dla mnie zadziałało) i zaokrąglonych rogów (2dp), aby całkowicie ukryć biel, a jednocześnie sprawić, że przycisk będzie solidny:

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>

Wynik końcowy wygląda następująco:

Bez bieli Brak białego wytłoczenia

Powinieneś celować w ten styl dla wersji 14 + i dostosować go lub wykluczyć w przypadku Gingerbread / Honeycomb, ponieważ ich natywne rozmiary przycisków różnią się od ICS i JB (np. Ten dokładny styl za przyciskiem Gingerbread skutkuje niewielką ilością bieli poniżej przycisku).


7

W przypadku widoku można ustawić krycie w następujący sposób.

view_name.setAlpha(float_value);

Właściwość view.setAlpha(int)jest przestarzała dla wersji API większej niż 11. Odtąd .setAlpha(0.5f)używana jest właściwość like .


6

Dla API <11 dla textView color zrobiłem:

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

Trochę uciążliwe, ale hej, to działa :-)


1

Wiem, że ma to już wiele odpowiedzi, ale odkryłem, że dla przycisków najłatwiej jest stworzyć własne selektory .xml i ustawić je na tle tego przycisku. W ten sposób możesz również zmienić stan po naciśnięciu lub włączeniu i tak dalej. Oto krótki fragment tego, którego używam. Jeśli chcesz dodać przezroczystość do dowolnego z kolorów, dodaj wiodącą wartość szesnastkową (#XXcccccc). (XX == „alfa koloru”)

<?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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.