Tôi thích đề xuất bộ lọc màu trong các câu trả lời trước từ @conjiledirection và @Tomasz; Tuy nhiên, tôi thấy rằng mã được cung cấp cho đến nay không dễ áp dụng như tôi mong đợi.
Đầu tiên, nó không được đề cập đến nơi áp dụng và xóa bộ lọc màu. Có thể có những nơi tốt khác để làm điều này, nhưng điều tôi nghĩ đến là OnTouchListener .
Từ việc tôi đọc câu hỏi ban đầu, giải pháp lý tưởng sẽ là một giải pháp không liên quan đến bất kỳ hình ảnh nào. Câu trả lời được chấp nhận bằng cách sử dụng custom_button.xml từ @emmby có lẽ phù hợp hơn các bộ lọc màu nếu đó là mục tiêu của bạn. Trong trường hợp của tôi, tôi bắt đầu với một hình ảnh png từ một nhà thiết kế UI về việc nút được cho là trông như thế nào. Nếu tôi đặt nền nút cho hình ảnh này, phản hồi tô sáng mặc định sẽ bị mất hoàn toàn. Mã này thay thế hành vi đó bằng hiệu ứng làm tối theo chương trình.
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();
}
});
Tôi đã trích xuất đây là một lớp riêng cho ứng dụng cho nhiều nút - được hiển thị dưới dạng lớp bên trong ẩn danh chỉ để lấy ý tưởng.