Wie ändere ich den Farbton des Image auf Fokus / Presse
-
26-09-2019 - |
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?
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
erfolgenBeachten 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.