2011-03-16 4 views
14

J'utilise un ImageButton. Mais je n'ai pas le surlignage quand on clique dessus. Je ai googlé et plusieurs ont suggéré d'utiliser le sélecteur où une autre image est affichée. Y a-t-il un moyen de contourner cela? en utilisant une seule image et en la mettant en surbrillance ou en lui donnant un effet de lueur. afin que l'utilisateur sache que le bouton a été cliqué.Android mettre en surbrillance une imagebutton lorsque vous cliquez sur

+0

Pouvez-vous montrer le code que vous utilisez pour créer le bouton d'image? – Cristian

Répondre

29

Ce n'est en fait pas très difficile à faire. Vous n'avez même pas besoin de créer 2 fichiers .png séparés ou quelque chose comme ça. Par exemple, si vous voulez avoir un bouton qui a une pente, puis le changer lorsque le bouton est pressé:

Étape 1: Créer gradient de bouton par défaut (drawable/de default_button.xml):

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <corners android:radius="3dp" /> 
    <gradient android:endColor="#8ba0bb" android:startColor="#43708f" android:angle="90" /> 
    <stroke android:width="1dp" android:color="#33364252" /> 
</shape> 

Étape 2: Création bouton par défaut gradient pressé (étirable/default_button_pressed.xml):

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <corners android:radius="3dp" /> 
    <gradient android:endColor="#43708f" android:startColor="#8ba0bb" android:angle="90" /> 
    <stroke android:width="1dp" android:color="#33364252" /> 
</shape> 

Étape 3: Création sélecteur (étirable/default_button_selector.xml):

<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_pressed="true" android:drawable="@drawable/default_button_pressed" /> 
    <item android:drawable="@drawable/default_button" /> 
</selector> 

Étape 4 (en option): Créer un style pour le bouton (valeurs/style.xml):

<resources> 
    <style name="DefaultButton"> 
     <item name="android:layout_width">wrap_content</item> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:background">@drawable/default_button_selector</item> 
    </style> 
</resources> 

Étape 5: utilisez le bouton (mise en page/main.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="fill_parent"> 

    <button style="@style/DefaultButton" /> 

</RelativeLayout> 

Comme vous pouvez le voir, ce n'est pas particulièrement difficile à faire.

+19

lol @Zack 'Comme vous pouvez le voir, ce n'est pas particulièrement difficile à faire. ' –

+2

C'est sympa car vous pouvez facilement ajouter un certain nombre de boutons en utilisant ce même style. –

+4

Que faire si nous avons besoin de boutons avec des images de fond différentes? – Kishore

2

Afin de ne pas avoir à définir plusieurs drawable pour chaque bouton, je définis l'attribut de filtre de couleur du bouton image dans un écouteur tactile.

Code Voir ici dans un autre post:

https://stackoverflow.com/a/14278790/891479

+0

+1 pour cette solution solide. –

18

Sans avoir à créer plusieurs images (comprimés, etc normale) et même ne pas créer sélecteur. Utilisez setOnTouchListener plutôt que setOnClickListener. Le code ci-dessous vous donnera la superposition grise sur l'article cliqué.

((ImageButton)findViewById(R.id.myImageBtn)).setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: { 
       ImageButton view = (ImageButton) v; 
       view.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP); 
       v.invalidate(); 
       break; 
      } 
      case MotionEvent.ACTION_UP: 

       // Your action here on button click 

      case MotionEvent.ACTION_CANCEL: { 
       ImageButton view = (ImageButton) v; 
       view.getBackground().clearColorFilter(); 
       view.invalidate(); 
       break; 
      } 
      } 
      return true; 
     } 
    }); 
+1

Cela a fonctionné pour moi. Veillez également à effacer le filtre de couleur sur ACTION_UP. –

+0

Mon ADT ne savait pas ce que 'PorterDuff' était, donc suffixe avec 'android.graphics' (android.graphics.PorterDuff.Mode.SRC_ATOP) pour l'achèvement du code laissé à l'esprit – 1owk3y

+0

m'a beaucoup aidé, merci! –

2

J'ai réussi à le faire !! D'abord, vous déclarez buttonStyle.xml dans le dossier drawable.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_focused="true" 
     android:state_pressed="true" 
     android:drawable="@drawable/button_pressed" /> 

    <item 
     android:state_focused="false" 
     android:state_pressed="true" 
     android:drawable="@drawable/button_pressed" /> 

    <item android:drawable="@drawable/button_normal" /> 
</selector> 

Ensuite, vous créez button_pressed.xml dans le dossier drawable.

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle" > 
    <solid android:color="@color/semiTransparentGnfrBlueColor" /> 
    <stroke android:width="10dp" android:color="@android:color/transparent" /> 
</shape> 

Après cela, vous créez button_normal.xml dans le dossier drawable.

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:innerRadiusRatio="3" 
    android:shape="rectangle"> 
    <solid android:color="@color/gnfrBlueColor"/> 
    <stroke android:width="10dp" android:color="@android:color/transparent" /> 
</shape> 

Vous pouvez utiliser des couleurs par défaut, mais si vous voulez le faire comme moi, vous devez avoir un fichier nommé couleurs.xml dans le dossier des valeurs et ces valeurs à l'intérieur:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<item name="gnfrBlueColor" type="color">#2A3748</item> 
    <item name="semiTransparentGnfrBlueColor" type="color">#602A3748</item> 
<integer-array name="androidcolors"> 
<item>@color/gnfrBlueColor</item> 
    <item>@color/semiTransparentGnfrBlueColor</item> 
    </integer-array> 
</resources> 

Enfin, vous réglez ce paramètre sur votre bouton ou tout autre:

savedAccountLoginButton.SetBackgroundResource(Resource.Drawable.buttonStyle); 

AVIS QUE Je mets un coup avec la couleur transparente parce que quand vous set backgroundresource votre bouton devient plus grand et avec cette astuce il reste original.

C'est la seule façon de pouvoir archiver cela par programme.

Si vous voulez faire en XML:

<Button 
      android:text="ENTRAR" 
      android:layout_width="match_parent" 
      android:layout_height="60dp" 
      android:background="@drawable/buttonstyle" 
      android:textColor="@color/white" 
      android:textSize="18sp" 
      android:id="@+id/button1" /> 
Questions connexes