Ich mag den Farbfiltervorschlag in früheren Antworten von @conjugatedirection und @Tomasz; Ich stellte jedoch fest, dass der bisher bereitgestellte Code nicht so einfach anzuwenden war, wie ich erwartet hatte.
Zunächst wurde nicht erwähnt, wo der Farbfilter angewendet und gelöscht werden soll. Es ist möglich, dass es andere gute Orte gibt, um dies zu tun, aber mir fiel ein OnTouchListener ein .
Nach meiner Lektüre der ursprünglichen Frage wäre die ideale Lösung eine, die keine Bilder enthält. Die akzeptierte Antwort mit custom_button.xml von @emmby passt wahrscheinlich besser als Farbfilter, wenn dies Ihr Ziel ist. In meinem Fall beginne ich mit einem PNG-Bild eines UI-Designers, das zeigt, wie die Schaltfläche aussehen soll. Wenn ich den Hintergrund der Schaltfläche auf dieses Bild einstelle, geht das Standard-Feedback zur Hervorhebung vollständig verloren. Dieser Code ersetzt dieses Verhalten durch einen programmatischen Verdunkelungseffekt.
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 0x6D6D6D sets how much to darken - tweak as desired
setColorFilter(v, 0x6D6D6D);
break;
// remove the filter when moving off the button
// the same way a selector implementation would
case MotionEvent.ACTION_MOVE:
Rect r = new Rect();
v.getLocalVisibleRect(r);
if (!r.contains((int) event.getX(), (int) event.getY())) {
setColorFilter(v, null);
}
break;
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
setColorFilter(v, null);
break;
}
return false;
}
private void setColorFilter(View v, Integer filter) {
if (filter == null) v.getBackground().clearColorFilter();
else {
// To lighten instead of darken, try this:
// LightingColorFilter lighten = new LightingColorFilter(0xFFFFFF, filter);
LightingColorFilter darken = new LightingColorFilter(filter, 0x000000);
v.getBackground().setColorFilter(darken);
}
// required on Android 2.3.7 for filter change to take effect (but not on 4.0.4)
v.getBackground().invalidateSelf();
}
});
Ich habe dies als separate Klasse für die Anwendung auf mehrere Schaltflächen extrahiert - als anonyme innere Klasse angezeigt, um die Idee zu bekommen.