Ini adalah solusi terbaik yang saya dapatkan dengan mengambil petunjuk dari jawaban @ Vinayak. Semua solusi lainnya memiliki kekurangan yang berbeda.
Pertama-tama buat fungsi seperti ini.
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);
}
Penjelasan:
getConstantState (). newDrawable () digunakan untuk menggandakan Drawable yang ada, jika tidak, drawable yang sama akan digunakan. Baca lebih lanjut dari sini:
Android: Menggandakan drawable untuk membuat StateListDrawable dengan filter
mutate () digunakan untuk membuat klon Drawable tidak membagikan statusnya dengan instance Drawable lainnya. Baca lebih lanjut di sini:
https://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate ()
Pemakaian:
Anda dapat meneruskan semua jenis View (Button, ImageButton, View dll) sebagai parameter ke fungsi dan mereka akan mendapatkan efek klik yang diterapkan padanya.
addClickEffect(myButton);
addClickEffect(myImageButton);