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óż.

Namratha
źródło
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"
Quintin Robinson
źródło
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"
lory105
źródło
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"
Geykel
źródło
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.

jiasli
źródło
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);
Adem
źródło
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)

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

Nishant Shah
źródło
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ą

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

Daniel Gomez Rico
źródł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"
Arsam
źródło
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" />
Akshay Paliwal
źródło
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>
Murtuza Khan
źródło
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" />
abir99
źródło
1

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

<ImageButton
    android:id="@+id/imageButton"
    android:src="@android:drawable/ic_menu_delete"
    android:background="@android:color/transparent"
/>
Nikolay Podolnyy
źródło
0

Jest to programowo ustawiony kolor tła jako przezroczysty

 ImageButton btn=(ImageButton)findViewById(R.id.ImageButton01);
 btn.setBackgroundColor(Color.TRANSPARENT);
Jawad Zeb
źródło
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
Muhammed Refaat
źródło
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   
Alireza Ghanbarinia
źródło
-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.

Kiyoshi
źródł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