@ Vinayak'ın cevabından ipuçları alarak bulduğum en iyi çözüm bu. Diğer tüm çözümlerin farklı dezavantajları vardır.
Öncelikle bunun gibi bir işlev oluşturun.
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);
}
Açıklama:
getConstantState (). newDrawable (), mevcut Drawable'ı klonlamak için kullanılır, aksi takdirde aynı drawable kullanılır. Buradan daha fazlasını okuyun:
Android: Filtrelerle bir StateListDrawable yapmak için bir çekilebilirliği klonlama
mutate (), Drawable klonun durumunu diğer Drawable örnekleriyle paylaşmamasını sağlamak için kullanılır. Buradan daha fazla bilgi edinin:
https://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate ()
Kullanım:
Fonksiyona parametre olarak her türlü View (Button, ImageButton, View vb.) İletebilirsiniz ve bunlara uygulanan tıklama efektini alırlar.
addClickEffect(myButton);
addClickEffect(myImageButton);