it-swarm.com.de

Wie ändere ich den Farbton eines ImageButton bei Fokus/Presse?

Ich habe eine ImageButton in meiner App und muss den Farbton des Bildes ändern, wenn der Button pressed/focused ist. Ich habe ImageButton gesetzt, um seine src aus einer XML-Datei zu erhalten, 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="@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>

Der Farbton wird jedoch nicht angewendet, wenn ImageButton gedrückt oder fokussiert wird - das Bild wird nur normal angezeigt. Die Farbe Schwarz ist wie immer als #000000 definiert. Irgendwelche Ideen?

53
Joseph Earl

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

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

81
Jeff

Gehen Sie dazu wie folgt vor, indem Sie nur xml ..__ verwenden. Erstellen Sie in Ihrem Zeichenordner einen Selektor. 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 habe ich das Attribut Android: tint auf das oben erstellte Zeichenelement gesetzt. 

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, mit der ein ImageView bei Druck oder aktiver Farbe eingefärbt werden kann Ähnliches gilt für ImageButton

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

7

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

<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 Festlegen des Farbtons in der Bitmap ist es möglich, dasselbe Zeichen in XML wiederzuverwenden, ohne Berührungen oder Unterklassen von ImageView oder ImageButton abzufangen.

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

6
ckern

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 das jemandem helfen, 2 Stunden nicht zu verlieren!

6
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;
            }
        });
2
Fu-Lung Chen

Mir ist aufgefallen, dass hier einige Anfragen für Leute bestehen, die wissen möchten, wie dies in XML gemacht wird. Es ist eigentlich ganz einfach. Dies kann mit einem layer-list erreicht werden.

Ihr Button kann gezeichnet werden (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 dies 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 jeder anderen XML-Datei verwenden:

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

Ich hoffe das hilft in Zukunft jemandem. 

1
aeskreis

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

So kann ich den neuen Button in der XML benutzen.

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

Sie können Farbe (Farbton) von XML festlegen. 

Setzen Sie transparent (Android:background="@null") für background und verwenden Sie 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" />
0
user4813855