Jak mieć przezroczysty ImageButton: Android


493
<ImageButton android:id="@+id/previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/media_skip_backward"
android:background="@drawable/transparent"></ImageButton>

To właśnie próbowałem uzyskać przezroczysty przycisk ImageButton, aby umieścić te przyciski w SurfaceView. Ale Eclipse wyświetla błąd w projekcie, gdy tylko dołączę przezroczystą linię do pliku xml.

Proszę pomóż.


3
tylko na marginesie: zamiast własnego przezroczystego obrazu można ogólnie użyć @android: kolor / przezroczysty - nie ma potrzeby tworzenia własnego przezroczystego obrazu
Mathias Conradt

6
Pamiętaj, że nadając przyciskowi obrazu przezroczyste tło, usuwasz wizualną informację zwrotną dotyczącą stanu kliknięcia przycisku (i prawdopodobnie wyłączenia). Powoduje to niewielki spadek użyteczności.
szeryf

Aby mieć pewność, że ImageButton faktycznie zostanie umieszczony na SurfaceView, przydatne jest również wywołanie previousButton.bringToFront (), w przeciwnym razie może być nadal ukryte za SurfaceView
Jay Snayder

Interfejs API Androida zapewnia poprawny atrybut, aby utworzyć przezroczyste tło bez utraty wizualnej informacji zwrotnej dla klikniętego przycisku lub dla innych stanów! Przeczytaj moją odpowiedź poniżej!
lory105,

Odpowiedzi:


984

Spróbuj użyć null dla tła ...

android:background="@null"

Dziękuję Ci. To działa. Widoczny jest tylko obraz, a nie ramka wokół niego. Ale czy mogę położyć ten przycisk nad SurfacaView, tj. Nad podglądem wideo? czy to możliwe? Jak mam to zrobić?
Namratha

1
@Namratha SurfaceViewPowinien umożliwiać przesuwanie przycisków nad powierzchnią, ale uwaga: „Można tego użyć do umieszczania nakładek, takich jak przyciski, na powierzchni urządzenia, jednak należy pamiętać, że może to mieć wpływ na wydajność, ponieważ pełne mieszanie alfa kompozyt zostanie wykonany za każdym razem, gdy zmieni się powierzchnia. ” from developer.android.com/reference/android/view/SurfaceView.html
Quintin Robinson

57
Niepoprawne jest używanie zerowego tła !! Interfejs API Androida zapewnia poprawny atrybut, aby utworzyć przezroczyste tło bez utraty wizualnej informacji zwrotnej dla klikniętego przycisku lub dla innych stanów! Przeczytaj moją odpowiedź poniżej!
lory105,

1
Ustawienie tła przycisku na wartość null nie jest dobrym pomysłem, jak wspomniano powyżej i poniżej. Odpowiedzi przy użyciu odpowiednich atrybutów są o wiele lepsze lub utwórz poprawny selektor z przezroczystym dla kliknięcia bez odpowiedniego kliknięcia.
Damian Walczak

To dało mi błąd .. Ale to zadziałało dla mnie android: background = "@ android: color / transparent"
Juan Mendez

303

NIE UŻYWAJ TRANSAPENTU LUB NULLU, ponieważ wtedy przycisk (lub ogólny widok) nie będzie już podświetlany po kliknięciu !!!

Miałem ten sam problem i wreszcie znalazłem poprawny atrybut z interfejsu API Androida, aby go rozwiązać. Może mieć zastosowanie do dowolnego widoku.

Użyj tego w specyfikacji przycisku:

android:background="?android:selectableItemBackground"

4
Wymaga to API 11 - eliminuje się 24% telefonów na wolności (od stycznia 2014 r.)
Shaun Neal

8
Wygląda na to, że przy użyciu biblioteki wsparcia można pokonać wymaganie API> = 11 stackoverflow.com/questions/19714682/…
Someonehere Somewhere

15
Aby uzyskać efekt okrągłej fali, użyjandroid:background="?android:selectableItemBackgroundBorderless"
Mateus Gondim

7
Na szczęście od 2019 r. Eliminuje to w przybliżeniu 0% telefonów na wolności.
user1032613,

140

Możesz także użyć przezroczystego koloru:

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

9
@Geykel, @Adam, powinieneś zdawać sobie sprawę, że ten atrybut jest dość niebezpieczny, gdy zostanie użyty bezwarunkowo, ponieważ doda kolejną przezroczystą warstwę, która zostanie przyciągnięta do ekranu i może spowodować nadpisanie pikseli i spowolnienie twojej aplikacji. Aby to przetestować, możesz użyć Developer option: Show GPU overdrawi zobaczyć różnicę między ustawieniem tła na @nulli @android:color/transparent.
amirlazarovich

To najlepsza i najskuteczniejsza odpowiedź. :)
Juan Mendez

112

Ustawienie tła "@null"spowoduje, że przycisk nie będzie działał po kliknięciu. To będzie lepszy wybór.

style="?android:attr/borderlessButtonStyle"

Później znalazłem to za pomocą

android:background="?android:attr/selectableItemBackground"

jest również dobrym rozwiązaniem. Możesz odziedziczyć ten atrybut w swoim własnym stylu.


nie działało dla mnie, a drugi spowodował awarię aplikacji. Być może źle zrobiłem, ale nie wiem co.
Yannis Dran

5
Wymaga interfejsu API na poziomie 11. Źródło
Jason Robinson

2
To jest poprawna odpowiedź. Również przy użyciu AppCompact, z tą odpowiedzią efekt tętnienia działa idealnie, a na api 19 normalny efekt wciśnięcia działa po wyjęciu z pudełka. android: background = "? android: attr / selectableItemBackground" Genialny!
Raffaeu

To rozwiązanie selectableItemBackgroundma dodatkową zaletę polegającą na zmianie stanu przycisku po kliknięciu. Inne rozwiązania sprawiają, że przycisk wydaje się niemożliwy do kliknięcia.
IgorGanapolsky

14

w czasie wykonywania możesz użyć następującego kodu

btn.setBackgroundDrawable(null);

8
btn.setBackgroundColor (Color.TRANSPARENT); Działa na wszystkich poziomach API
AlBeebe

setBackgroundDrawable jest przestarzałe, użyj setbackGroundColor, jak zasugerowano powyżej przez AlBeebe
bhaskarc

ta metoda jest teraz przestarzała
Ray Kiddy

11

Uważam, że przyjęta odpowiedź powinna brzmieć: android:background="?attr/selectableItemBackground"

Jest to to samo, co odpowiedź @ lory105, ale wykorzystuje bibliotekę wsparcia dla maksymalnej kompatybilności ( android:odpowiednik jest dostępny tylko dla API> = 11)


8

Usuń tę linię:

android:background="@drawable/transparent">

A w zestawie klas aktywności

ImageButton btn = (ImageButton)findViewById(R.id.previous);
btn.setAlpha(100);

Możesz ustawić poziom alfa od 0 do 255

o oznacza przezroczysty, a 255 oznacza nieprzezroczysty.


Ale czy to pozwala przyciskowi położyć się na SurfaceView?
Namratha

5
Ta odpowiedź jest błędna i myląca, ponieważ sprawia, że ​​cały przycisk jest półkryjący. Jeśli chcesz to zrobić z kodu, przekaż null do metody setBackground. setAlpha nie jest tym, czego potrzebujesz.
Quintin Willison,

Dzięki temu cały widok jest przejrzysty.
Raj

5

Najlepszym sposobem jest użycie przezroczystego kodu koloru

android:background="#00000000"

użyj kodu koloru # 00000000, aby uczynić dowolną rzecz przezroczystą


4
@android:color/transparentbez zakodowanych wartości.
Fred

1
Nie, wartości referencyjne powinny być preferowane ... ale IMO, @Fred, nawet umieszczenie @android:odniesienia bezpośrednio w układzie jest uważane za wartość zakodowaną na stałe, ponieważ jeśli chcesz je zmienić, nadal musisz surfować w układzie, aby je znaleźć. Zadeklaruję coś takiego <item name="something">@android:color/transparent</item>i użyję własnej wartości w układzie, aby łatwo znaleźć ją w pliku resources.xml i zmienić bez konieczności wyszukiwania w układzie
Cliff Burton,

2

Użyj ImageView... domyślnie ma przezroczyste tło ...


3
Ale to nie guzik
Moesio,

2
Możesz użyć ImageView jako przycisku. W kodzie java mówisz po prostu ImageView previous = (ImageView) findViewById (R.id.previous); a następnie previous.setOnClickListener (nowy OnClickListener {public void onClick (/ * dzieje się to po dotknięciu ImageView * /)}); Voila!
marienke

2

Już dodawałem coś do tła, więc to działało dla mnie:

   android:backgroundTint="@android:color/transparent"

(Android Studio 3.4.1)

EDYCJA : działa tylko na Android api poziomu 21 i wyższych. dla kompatybilności użyj tego zamiast tego

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

1

Użyj tego:

<ImageButton
 android:id="@+id/back"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="@null"
 android:padding="10dp"
 android:src="@drawable/backbtn" />

1

Ustaw tło ImageButton jako @null w XML

<ImageButton android:id="@+id/previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/media_skip_backward"
android:background="@null"></ImageButton>

1

Użyj „@ null” . To zadziałało dla mnie.

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/bkash"
    android:id="@+id/bid1"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:background="@null" />

1

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

<ImageButton
    android:id="@+id/imageButton"
    android:src="@android:drawable/ic_menu_delete"
    android:background="@android:color/transparent"
/>

0

Jest to programowo ustawiony kolor tła jako przezroczysty

 ImageButton btn=(ImageButton)findViewById(R.id.ImageButton01);
 btn.setBackgroundColor(Color.TRANSPARENT);

0

Programowo można to zrobić poprzez:

image_button.setAlpha(0f) // to make it full transparent
image_button.setAlpha(0.5f) // to make it half transparent
image_button.setAlpha(0.6f) // to make it (40%) transparent
image_button.setAlpha(1f) // to make it opaque

Nie jestem zwycięzcą, ale wydaje się, że cały obraz jest przezroczysty, a nie tylko tło.
Trevor

@threed Wiem, i to dokładnie OP pyta w swoich pytaniach „przezroczysty ImageButton”.
Muhammed Refaat

1
Masz absolutną rację, OP poprosił o przezroczysty przycisk. Ale jego przykład sugeruje, że mógł poprosić o przycisk z przezroczystym tłem (np android:background="@drawable/transparent".). Tak czy inaczej, proponuję tylko możliwy powód do głosowania; Nie twierdzę, że jest to uzasadnione.
Trevor

1
@ dobrze traktowane, być może był to powód, dziękuję w jakikolwiek sposób.
Muhammed Refaat

0

W swoim Backgroundatrybucie zestawu XML dowolnego White(#FFFFFF)odcienia lub Black(#000000)odcienia. Jeśli chcesz przezroczystości, po prostu wstaw 80 przed faktycznym kodem mieszającym.

#80000000   

-2
<ImageButton
    android:id="@+id/previous"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/media_skip_backward">
</ImageButton>

Użyłem przezroczystego pngdo ImageButtoni ImageButtondziałało.


To nie jest dobre rozwiązanie .. użyj odpowiedniego atrybutu dostarczonego przez interfejs API Androida! Przeczytaj moje answare.
lory105,

Spowoduje to powstanie kolejnej warstwy, dodając do overdraw.
tir38
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.