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.