Question

J'ai un ImageButton dans mon application et je dois changer la teinte de l'image lorsque le bouton est pressed/focused. Je l'ensemble de ImageButton pour obtenir son src à partir d'un fichier XML qui suit comme:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- pressed -->
    <item 
        android:state_pressed="true"
        android:tint="@color/black"
        android:drawable="@drawable/search"
        />

    <!-- focused -->
    <item 
        android:state_focused="true"
        android:tint="@color/black"
        android:drawable="@drawable/search"
        />

    <!-- default -->
    <item
        android:tint="@null"
        android:drawable="@drawable/search"
        />

</selector>

Cependant, la teinte est pas appliquée lorsque l'on appuie sur ImageButton ou concentré - l'image juste affiche normalement. La couleur noire est définie comme #000000 comme toujours. Toutes les idées?

Était-ce utile?

La solution

Vous pouvez changer la teinte, assez facilement dans le code via:

ImageButton button = (ImageButton) this.findViewById(R.id.button_i_want_to_modify);
button.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint

it helps.

JS

Autres conseils

Voici comment le faire en utilisant seulement xml. Dans votre dossier drawable créer un sélecteur. Par exemple: touch_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- State when a row is being pressed, but hasn't yet been activated (finger down) -->
    <item android:state_pressed="true" android:color="@color/semi_slate" />

    <!-- When the view is "activated".  In SINGLE_CHOICE_MODE, it flags the active row
     of a ListView -->
    <item android:state_activated="true" android:color="@color/semi_slate" />

    <!-- Default, "just hangin' out" state. -->
    <item android:color="@android:color/transparent" />
</selector>

À mon avis Image en xml je définir l'attribut android: teinte au drawable créé ci-dessus.

android:tint = "@drawable/touch_selector"

Le code tout ressemblait à ceci:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/poster"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:tint="@drawable/touch_selector" />

Ceci est une solution universelle xml, de mettre sur une teinte ImageView sur la presse ou sur actif. peut être fait similaire pour ImageButton

Notez que cela ne fonctionne que pour le niveau de l'API> = 21.

J'ai trouvé une façon de le faire en XML (en api 21 et au moins).

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <bitmap
            android:src="@drawable/search"
            android:tint="@color/black"
            />
    </item>
    <item android:drawable="@drawable/search"/>
</selector>

En réglant la teinte sur le bitmap il est possible de réutiliser le même drawable en XML sans avoir à intercepter les touches ou sous-classe ImageView ou ImageButton.

Une fois que le sélecteur a été créé, il suffit d'appliquer que src du ImageView ou ImageButton.

Enfin, je l'ai trouvé une solution pour API <21:

Button more = (Button) findViewById(R.id.more);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    more.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN);
} else {
    Drawable wrapDrawable = DrawableCompat.wrap(more.getBackground());
    DrawableCompat.setTint(wrapDrawable, color));
    more.setBackgroundDrawable(DrawableCompat.unwrap(wrapDrawable));
}

Mai ce que quelqu'un aide à ne pas perdre 2 heures!

bt.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        bt.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint
                        return true; // if you want to handle the touch event
                    case MotionEvent.ACTION_UP:
                        bt.clearColorFilter(); // White Tint
                        return true; // if you want to handle the touch event
                }
                return false;
            }
        });

Ce que je fais est d'ajouter un bouton personnalisé qui a la fonction setColorFilter.

Comme cela, je peux utiliser le nouveau bouton dans le fichier XML.

public class CustomButton extends Button {

public CustomButton(Context context) {
    super(context);
}

public CustomButton(Context context, AttributeSet attributes) {
    super(context, attributes);
};

@Override
public boolean onTouchEvent(MotionEvent event) {
    int maskedAction = event.getActionMasked();
    if (maskedAction == MotionEvent.ACTION_DOWN)
        getBackground().setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN);
    else if (maskedAction == MotionEvent.ACTION_UP)
        getBackground().setColorFilter(null);
    return super.onTouchEvent(event);
}}

et pour le ImageButton

public class CustomImageButton extends ImageButton {

public CustomImageButton(Context context) {
    super(context);
}

public CustomImageButton(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    int maskedAction = event.getActionMasked();
    if (maskedAction == MotionEvent.ACTION_DOWN)
        setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN);
    else if (maskedAction == MotionEvent.ACTION_UP)
        setColorFilter(null);
    return super.onTouchEvent(event);
}}

J'ai remarqué qu'il ya des demandes ici pour les personnes qui veulent savoir comment faire en XML. Il est en fait assez simple. Ceci peut être accompli en utilisant un layer-list

Le drawable de votre bouton (drawable / some_button.xml):

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

Et c'est le drawable mis en évidence (drawable / some_button_highlighted.xml)

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/some_button_image"/>
    <item>
        <shape>
            <solid android:color="@color/highlighted_button_color" />
        </shape>
    </item>
</layer-list>

Maintenant, vous pouvez l'utiliser dans tout autre xml:

...
android:drawable="@drawable/some_button"
...

J'espère que cela aide quelqu'un à l'avenir.

Vous pouvez définir la couleur (teinte) de xml.

Set transparent (android:background="@null") pour background puis utilisez tint:

<ImageButton
     android:layout_width="wrap_content"
     android:layout_height="fill_parent"
     android:tint="@color/Amber_200"
     android:background="@null"
     android:src="@drawable/back_selector" />

Comme vous avez défini le sélecteur pour le src de la ImageButton Android va AFAIK juste prendre le drawable parce que ce correspond au type de src. Donc, la teinte ne sera pas utilisé.

Cependant, j'ai eu un problème similaire: J'ai aussi essayé d'utiliser un sélecteur comme la vôtre, mais pour l'androïde: valeur de la teinte de la ImageButton au lieu d'Android: src. Bien sûr, je les valeurs de omettais teinte que vous avez dans votre sélection. Cela résoudrait votre problème, aussi, parce que vous voulez utiliser le même drawable pour tous les Etats. Chose curieuse, je reçois un everytime NumberFormatException indiquant que le système n'a pas pu analyser « res / couleur / tint_selector.xml » (ce qui est en effet mon sélecteur) en entier. Pour être précis mes regards de code comme ceci:

Ceci est mon sélecteur, enregistré dans /res/color/tint_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_pressed="true"
         android:color="#D3D3D3"/> <!-- pressed -->
   <item android:color="#ff000000"/> <!-- default -->
</selector>

Et voici le ImageButton correspondant:

<ImageButton android:id="@+id/program_help"
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content"
     android:src="@drawable/symbol"
     android:tint="@color/tint_selector">
</ImageButton>

Peut-être que cela vous aide un peu mais il ne fonctionne pas actuellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top