Đây là giải pháp tốt nhất mà tôi đưa ra với những gợi ý từ câu trả lời của @ Vinayak. Tất cả các giải pháp khác đều có những nhược điểm khác nhau.
Trước hết hãy tạo một chức năng như thế này.
void addClickEffect(View view)
{
Drawable drawableNormal = view.getBackground();
Drawable drawablePressed = view.getBackground().getConstantState().newDrawable();
drawablePressed.mutate();
drawablePressed.setColorFilter(Color.argb(50, 0, 0, 0), PorterDuff.Mode.SRC_ATOP);
StateListDrawable listDrawable = new StateListDrawable();
listDrawable.addState(new int[] {android.R.attr.state_pressed}, drawablePressed);
listDrawable.addState(new int[] {}, drawableNormal);
view.setBackground(listDrawable);
}
Giải trình:
getConstantState (). newDrawable () được sử dụng để sao chép Drawable hiện có, nếu không, cùng một drawable sẽ được sử dụng. Đọc thêm từ đây:
Android: Sao chép một drawable để tạo StateListDrawable với các bộ lọc
mutate () được sử dụng để làm cho bản sao Drawable không chia sẻ trạng thái của nó với các trường hợp khác của Drawable. Đọc thêm về nó tại đây:
https://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate ()
Sử dụng:
Bạn có thể chuyển bất kỳ loại Chế độ xem nào (Nút, ImageButton, Chế độ xem, v.v.) làm tham số cho hàm và chúng sẽ nhận được hiệu ứng nhấp chuột được áp dụng cho chúng.
addClickEffect(myButton);
addClickEffect(myImageButton);