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.

ncakmak
źródło

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;
  }
}
RoToRa
źródło
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).

Jake Wilson
źródło
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)

abhi
źródło
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"
Akos Cz
źródło
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);
cange1
źródło
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.

Raja Jawahar
źródło
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) .

Josnidhin
źródło
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.

Hesam
źródło
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).

annie
źródło
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 .

Palash Dange
źródło
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 :-)

EZDsIt
źródło
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>
Konrad Winkowski
źródło