Wie ändere ich den Farbton eines ImageButtons beim Fokussieren / Drücken

Lesezeit: 6 Minuten

Benutzer-Avatar
Josef Graf

ich habe ein ImageButton in meiner App und ich muss den Farbton des Bildes ändern, wenn die Schaltfläche angezeigt wird pressed/focused. ich habe ImageButton eingestellt, um es zu bekommen src aus einer XML-Datei, die wie folgt lautet:

<?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="https://stackoverflow.com/questions/3024983/@drawable/search"
        />

    <!-- focused -->
    <item 
        android:state_focused="true"
        android:tint="@color/black"
        android:drawable="https://stackoverflow.com/questions/3024983/@drawable/search"
        />

    <!-- default -->
    <item
        android:tint="@null"
        android:drawable="https://stackoverflow.com/questions/3024983/@drawable/search"
        />

</selector>

Die Tönung wird jedoch nicht angewendet, wenn die ImageButton gedrückt oder fokussiert wird – das Bild wird ganz normal angezeigt. Die Farbe Schwarz ist definiert als #000000 wie immer. Irgendwelche Ideen?

  • Hallo. Ich habe mich gefragt, ob Sie endlich eine XML-Lösung gefunden haben. Danke im Voraus.

    – Daniel Higueras

    28. Januar 2012 um 21:15 Uhr


Benutzer-Avatar
Jeff

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

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

Ich hoffe es hilft.

JS

  • Funktioniert. Aber ich möchte es wenn möglich per XML (sorry picky).

    – Josef Graf

    23. Februar 2011 um 21:26 Uhr

  • Überprüfen Sie die Antwort unter stackoverflow.com/questions/19500039/…

    – asib

    4. August 2014 um 7:14 Uhr

  • Oder verwenden Sie die Datenbindung.

    – Ubuntudroid

    22. September 2017 um 5:43 Uhr

  • Hinzufügen android:tint="@color/myColor" hat bei mir funktioniert.

    – Saqib R.

    3. Juni 2019 um 12:08 Uhr

Benutzer-Avatar
Raschi Karanpuria

Hier erfahren Sie, wie Sie dies nur mit XML tun. Erstellen Sie in Ihrem Drawable-Ordner einen Selektor. Beispiel: 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 setze ich das Attribut android:tint auf das oben erstellte drawable.

android:tint = "@drawable/touch_selector"

Der ganze Code sah so 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 reine XML-Lösung, um eine Bildansicht beim Drücken oder Aktivieren zu färben. Ähnliches kann für ImageButton getan werden

Beachten Sie, dass dies nur für API-Level >= 21 funktioniert.

  • Sie können es auch für APIs unter 21 mit app:tint verwenden.

    – Samih EL SACHAWI

    17. September 2018 um 19:50 Uhr

  • Ich weiß nicht, was los ist. Nachdem dieser Farbton eingestellt wurde, würde die imageView im normalen Zustand transparent werden …

    – Yeung

    22. November 2019 um 10:49 Uhr

Benutzer-Avatar
Henrique de Sousa

Endlich habe ich eine Lösung für API < 21 gefunden:

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

Möge dies jemandem helfen, keine 2 Stunden zu verlieren!

  • Wenn Sie drawablecompat verwenden, sollten Sie es problemlos auf niedrigeren API-Versionen verwenden können

    – Dabluck

    15. Dezember 2015 um 21:09 Uhr

  • Ich habe einen normalen Button mit einem benutzerdefinierten XML-Layout verwendet. DrawableCompat war bis heute der einzige Fix, der auf Pre-API 21 funktionierte.

    – Henrique de Sousa

    16. Dezember 2015 um 11:02 Uhr

  • Siehe auch meine andere Antwort unter stackoverflow.com/questions/31021823/… für die Verwendung von DrawableCompat vor API 21.

    – Henrique de Sousa

    2. Dezember 2020 um 18:33 Uhr

Ich habe einen Weg gefunden, dies in XML zu tun (mindestens in API 21 und höher).

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

Durch Festlegen des Farbtons auf der Bitmap ist es möglich, dasselbe Drawable in XML wiederzuverwenden, ohne dass Berührungen abgefangen oder ImageView oder ImageButton abgeleitet werden müssen.

Sobald der Selektor erstellt wurde, wenden Sie ihn einfach als src von ImageView oder ImageButton an.

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

Benutzer-Avatar
Elisa Sterngold

Ich füge eine benutzerdefinierte Schaltfläche hinzu, die die Funktion setColorFilter hat.

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

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

Mir ist aufgefallen, dass es hier einige Anfragen für Leute gibt, die wissen möchten, wie man das in XML macht. Es ist eigentlich ganz einfach. Dies kann mit einem erreicht werden layer-list

Drawable Ihres Buttons (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>

Und das ist das hervorgehobene drawable (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>

Jetzt können Sie dies in jedem anderen XML verwenden:

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

Ich hoffe, das hilft jemandem in der Zukunft.

  • Dies zeichnet nur ein festes Quadrat über das Drawable. Wenn es eine Möglichkeit gäbe, die zweite Ebene dazu zu bringen, die vorherige Ebene als Alphamaske zu verwenden, wäre dies cool

    – verdammter Maurer

    30. Oktober 2014 um 11:25 Uhr

1228670cookie-checkWie ändere ich den Farbton eines ImageButtons beim Fokussieren / Drücken

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy