Frage

Ich habe eine ImageButton in meiner app und ich brauche den Farbton des Bildes zu ändern, wenn die Taste pressed/focused ist. Ich habe den ImageButton Satz seine src aus einer XML-Datei zu erhalten, die wie folgt:

<?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>

Allerdings wird die Tönung nicht angewandt, wenn der ImageButton gedrückt wird oder fokussiert - das Bild nur Displays als normal. Die Farbe Schwarz wird als #000000 wie immer definiert. Irgendwelche Ideen?

War es hilfreich?

Lösung

Sie können den Farbton ändern, ganz einfach in Code über:

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

Hope es hilft.

JS

Andere Tipps

Hier ist, wie es zu tun, nur mit Hilfe von XML. In Ihrem ziehbar Ordner einen Selektor erstellen. ZB: 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>

In meiner Bildansicht in xml stelle ich das android: Farbton-Attribut auf die ziehbar oben erstellt.

android:tint = "@drawable/touch_selector"

Der gesamte Code sah wie folgt aus:

<?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" />

Dies ist eine all xml-Lösung auf einem Image auf Presse zu setzen Tönung oder auf aktiv. Ähnliches kann für Image

erfolgen

Beachten Sie, dass dies nur für die API-Ebene funktioniert> = 21

Ich fand einen Weg, dies in XML zu tun (in api 21 und bis zumindest).

<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>

Durch den Farbton auf der Bitmap-Einstellung ist es möglich, die gleiche ziehbar in xml wieder zu verwenden, ohne zu Intercept Berührt oder Unterklasse Image oder Image.

Wenn der Selektor erstellt wurde, gilt nur, dass als src des Image oder Image.

Schließlich habe ich eine Lösung für API gefunden <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 diese Hilfe jemand nicht 2 Stunden zu verlieren!

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;
            }
        });

Was ich tue, ist eine benutzerdefinierte Schaltfläche hinzufügen, die die Funktion setColorFilter hat.

Wie das ich die neue Schaltfläche in der XML verwenden kann.

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);
}}

und für das Image

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);
}}

Ich habe bemerkt, gibt es einige Anfragen hier für die Menschen wollen wissen, wie diese in XML zu tun. Es ist eigentlich ganz einfach. Dies kann mit einem layer-list erreicht werden

Ihre Schaltfläche ziehbar (ziehbar / 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>

Und das ist die hervorgehoben ziehbar (ziehbar / 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>

Jetzt können Sie diese in einem anderen XML verwenden:

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

Ich hoffe, das jemand in der Zukunft hilft.

Sie können Farbe (Tönung) von xml gesetzt.

Set transparent (android:background="@null") für background dann tint verwenden:

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

Wenn Sie den Selektor definiert die src des Image Android sein wird AFAIK nur die ziehbar nehmen, weil das ist, was die Art der src entspricht. So Farbton wird nicht verwendet werden.

Trotzdem hatte ich ein ähnliches Problem: Ich habe auch einen Selektor wie das Ihre verwenden versucht, aber für den Android: Tonwert des Image anstelle von Android: src. Natürlich verzichtet ich die Tönung Werte, die Sie in Ihrem Wähler haben. Dies würde Ihr Problem lösen, auch, weil Sie die gleiche ziehbar für alle Staaten verwendet werden sollen. Ich erhalte Merkwürdiger eine Number jedes Mal besagt, dass das System nicht in der Lage war zu ‚res / Farbe / tint_selector.xml‘ parsen als integer (die in der Tat meine Wähler ist). Um genau zu sein mein Code sieht wie folgt aus:

Das ist meine Wähler, in /res/color/tint_selector.xml gespeichert:

<?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>

Und das ist die entsprechende Image:

<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>

Vielleicht hilft Ihnen ein wenig, obwohl es funktioniert momentan nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top