Comment avoir un ImageButton transparent: 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>

C'est ce que j'ai essayé d'obtenir un ImageButton transparent afin de placer ces boutons sur une SurfaceView. Mais Eclipse, me donne une erreur dans le projet dès que j'inclus la ligne transparente en xml.

Veuillez aider.


3
juste une remarque: au lieu de votre propre image transparente, vous pouvez généralement aussi utiliser @android: color / transparent - pas besoin de votre propre image transparente personnalisée
Mathias Conradt

6
Veuillez noter qu'en donnant au bouton d'image un arrière-plan transparent, vous supprimez un retour visuel pour l'état du bouton cliqué (et probablement désactivé). Il en résulte une légère diminution de l'utilisabilité.
szeryf

Afin d'être sûr que l'ImageButton est réellement placé sur le SurfaceView, il est également utile d'appeler previousButton.bringToFront (), sinon il peut toujours être caché derrière le SurfaceView
Jay Snayder

L'API Android fournit l'attribut correct pour créer un arrière-plan transparent sans perdre le retour visuel pour le bouton cliqué ou pour les autres états! Lisez ma réponse ci-dessous!
lory105

Réponses:


984

Essayez d'utiliser null pour l'arrière-plan ...

android:background="@null"

Je vous remercie. Cela marche. Seule l'image est vue et non la boîte qui l'entoure. Mais puis-je placer ce bouton sur le SurfacaView, c'est-à-dire sur l'aperçu vidéo? Est-ce possible? Comment fait-on ça?
Namratha

1
@Namratha The SurfaceViewdevrait vous permettre de masquer vos boutons sur une surface, mais notez: "Cela peut être utilisé pour placer des superpositions telles que des boutons au-dessus de la surface, mais notez cependant que cela peut avoir un impact sur les performances car un mélange alpha complet composite sera effectué à chaque fois que la surface change. " de developer.android.com/reference/android/view/SurfaceView.html
Quintin Robinson

57
Ce n'est pas correct d'utiliser un fond nul !! L'API Android fournit l'attribut correct pour créer un arrière-plan transparent sans perdre le retour visuel pour le bouton cliqué ou pour les autres états! Lisez ma réponse ci-dessous!
lory105

1
La définition de l'arrière-plan du bouton sur null n'est pas une bonne idée, comme mentionné ci-dessus et ci-dessous. Les réponses à l'aide d'attributs appropriés sont bien meilleures, ou créez un sélecteur correct avec transparent pour les commentaires non cliqués et appropriés lorsque vous cliquez dessus.
Damian Walczak

Cela m'a donné une erreur .. Mais cela a fonctionné pour moi android: background = "@ android: color / transparent"
Juan Mendez

303

N'UTILISEZ PAS DE DISPOSITION TRANSAPENTE OU NULL car le bouton (ou la vue générique) ne sera plus mis en surbrillance au clic !!!

J'ai eu le même problème et j'ai finalement trouvé l'attribut correct de l'API Android pour résoudre le problème. Il peut s'appliquer à n'importe quelle vue.

Utilisez-le dans les spécifications du bouton:

android:background="?android:selectableItemBackground"

4
Cela nécessite l'API 11 - vous éliminez 24% des téléphones dans la nature (en janvier 2014)
Shaun Neal

8
Il semble qu'en utilisant la bibliothèque de support, l'exigence API> = 11 pourrait être surmontée stackoverflow.com/questions/19714682/…
Someone Somewhere

15
Pour un effet d'ondulation rond, utilisezandroid:background="?android:selectableItemBackgroundBorderless"
Mateus Gondim

7
Heureusement à partir de 2019, cela élimine environ 0% des téléphones à l'état sauvage.
user1032613

140

Vous pouvez également utiliser une couleur transparente:

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

9
@Geykel, @Adam, vous devez être conscient que cet attribut est assez dangereux lorsqu'il est utilisé sans condition car il ajoutera un autre calque transparent qui sera dessiné à l'écran et pourrait entraîner des pixels surchargés et ralentir votre application. Pour le tester, vous pouvez utiliser le Developer option: Show GPU overdrawet voir la différence entre définir un arrière-plan sur @nullet @android:color/transparent.
amirlazarovich

C'est la meilleure et la plus efficace réponse. :)
Juan Mendez

112

La définition de l'arrière-plan "@null"rendra le bouton sans effet lorsqu'il est cliqué. Ce sera un meilleur choix.

style="?android:attr/borderlessButtonStyle"

Plus tard, j'ai découvert qu'en utilisant

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

est également une bonne solution. Et vous pouvez hériter de cet attribut dans votre propre style.


n'a pas fonctionné pour moi et le second a fait planter l'application. Peut-être que je me suis trompé mais je ne sais pas quoi.
Yannis Dran

5
Nécessite l'API niveau 11. Source
Jason Robinson

2
Ceci est la bonne réponse. En utilisant également AppCompact, avec cette réponse, l'effet d'entraînement fonctionne parfaitement et sur l'api 19, l'effet pressé normal fonctionne hors de la boîte. android: background = "? android: attr / selectableItemBackground" Brillant!
Raffaeu

Cette solution selectableItemBackgrounda l'avantage supplémentaire de faire changer l'état du bouton lorsque vous cliquez dessus. Les autres solutions font apparaître le bouton non cliquable.
IgorGanapolsky

14

en exécution, vous pouvez utiliser le code suivant

btn.setBackgroundDrawable(null);

8
btn.setBackgroundColor (Color.TRANSPARENT); Fonctionne à tous les niveaux d'API
AlBeebe

setBackgroundDrawable est déconseillé, utilisez setbackGroundColor comme suggéré ci-dessus par AlBeebe
bhaskarc

cette méthode est désormais déconseillée
Ray Kiddy

11

Je pense que la réponse acceptée devrait être: android:background="?attr/selectableItemBackground"

C'est la même chose que la réponse de @ lory105 mais elle utilise la bibliothèque de support pour une compatibilité maximale (l' android:équivalent n'est disponible que pour l'API> = 11)


8

Supprimez cette ligne:

android:background="@drawable/transparent">

Et dans votre classe d'activités

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

Vous pouvez définir le niveau alpha 0 à 255

o signifie transparent et 255 signifie opaque.


Mais cela permet-il au bouton de se trouver au-dessus de SurfaceView?
Namratha

5
Cette réponse est fausse et trompeuse car elle rend l'ensemble du bouton semi-opaque. Si vous souhaitez le faire à partir du code, passez null à la méthode setBackground. setAlpha n'est pas ce dont vous avez besoin.
Quintin Willison

Cela rend toute la vue transparente.
Raj

5

La meilleure façon est d'utiliser le code couleur transparent

android:background="#00000000"

utilisez le code couleur # 00000000 pour rendre tout ce qui est transparent


4
@android:color/transparentsans valeurs codées en dur.
Fred

1
Non, les valeurs référencées devraient être préférées ... mais IMO, @Fred, même en mettant une @android:référence directement dans la mise en page est considéré comme une valeur codée en dur car si vous voulez le changer, vous devez toujours surfer dans la mise en page pour le trouver. Je déclarerais quelque chose comme ça <item name="something">@android:color/transparent</item>et utiliserais ma propre valeur dans la disposition afin que je puisse facilement la trouver dans mon fichier resources.xml et la changer sans avoir à la rechercher dans la disposition
Cliff Burton

2

Utilisez ImageView... il a un fond transparent par défaut ...


3
Mais ce n'est pas un bouton
Moesio

2
Vous pouvez utiliser une ImageView comme bouton. Dans votre code java, vous dites simplement ImageView previous = (ImageView) findViewById (R.id.previous); et ensuite previous.setOnClickListener (new OnClickListener {public void onClick (/ * cela se produit lorsque vous touchez ImageView * /)}); Voila!
marienke

2

J'ajoutais déjà quelque chose à l'arrière-plan, donc, cette chose a fonctionné pour moi:

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

(Android Studio 3.4.1)

EDIT : ne fonctionne que sur le niveau 21 et supérieur de l'API Android. pour la compatibilité, utilisez ceci

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

1

Utilisez ceci:

<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

Définissez l'arrière-plan de l'ImageButton comme @null en 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

Utilisez "@null" . Ça a marché pour moi.

<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

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

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

0

Ceci est programmé comme couleur d'arrière-plan transparente

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

0

Par programme, cela peut être fait par:

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

Je ne suis pas le downvoter, mais cela semble rendre l'image entière transparente, pas seulement l'arrière-plan.
Trevor

@threed je sais, et c'est exactement l'OP qui demande dans ses quêtes, "un ImageButton transparent".
Muhammed Refaat

1
Vous avez absolument raison, l'OP a demandé un bouton transparent. Mais son exemple suggère qu'il aurait pu vouloir demander un bouton avec un fond transparent (par exemple android:background="@drawable/transparent"). Quoi qu'il en soit, je suggère simplement une raison possible du downvote; Je ne dis pas que c'est justifié.
Trevor

1
@threed bien, peut-être que c'était la raison, merci de toute façon.
Muhammed Refaat

0

Dans votre Backgroundattribut XML set à n'importe quelle White(#FFFFFF)nuance ou nuance de Black(#000000)couleur.Si vous voulez de la transparence, mettez simplement 80 avant le code de hachage réel.

#80000000   

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

J'ai utilisé un transparent pngpour le ImageButton, et le ImageButtontravaillé.


Ce n'est pas une bonne solution .. utilisez le bon attribut fourni par l'API Android! Lisez mon answare.
lory105

Cela se traduira par une autre couche, s'ajoutant à l'overdraw.
tir38
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.