我喜欢@conjugatedirection 和@Tomasz 先前答案中的滤色器建议;但是,我发现到目前为止提供的代码并不像我预期的那么容易应用。
首先,没有提到在哪里应用和清除滤色器。可能还有其他好地方可以做到这一点,但我想到的是OnTouchListener。
根据我对原始问题的阅读,理想的解决方案是不涉及任何图像的解决方案。如果这是您的目标,使用来自@emmby 的 custom_button.xml 接受的答案可能比滤色器更合适。就我而言,我从 UI 设计师的 png 图像开始,该图像应该是按钮的外观。如果我将按钮背景设置为此图像,则默认的高亮反馈将完全丢失。此代码用程序化变暗效果替换了该行为。
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();
}
});
我将它提取为一个单独的类,用于多个按钮的应用程序 - 显示为匿名内部类只是为了了解这个想法。