मुझे @conjugatedirection और @Tomasz से पिछले उत्तरों में रंग फिल्टर सुझाव पसंद है; हालाँकि, मैंने पाया कि अब तक प्रदान किया गया कोड उतनी आसानी से लागू नहीं हुआ जितना मुझे उम्मीद थी।
सबसे पहले, यह उल्लेख नहीं किया गया था कि रंग फ़िल्टर कहां लागू करें और साफ़ करें। यह संभव है कि ऐसा करने के लिए अन्य अच्छी जगहें हों, लेकिन मेरे लिए जो बात दिमाग में आई वह थी एक OnTouchListener ।
मूल प्रश्न के मेरे पढ़ने से, आदर्श समाधान वह होगा जिसमें कोई चित्र शामिल न हो। @Emmby से custom_button.xml का उपयोग कर स्वीकार किए गए उत्तर शायद रंग फिल्टर की तुलना में एक बेहतर फिट है यदि यह आपका लक्ष्य है। मेरे मामले में, मैं यूआई डिजाइनर से एक पीएनजी छवि के साथ शुरू कर रहा हूं जो कि बटन जैसा दिखने वाला है। यदि मैं इस छवि के लिए बटन पृष्ठभूमि सेट करता हूं, तो डिफ़ॉल्ट हाइलाइट प्रतिक्रिया पूरी तरह से खो जाती है। यह कोड उस व्यवहार को एक प्रोग्रामेटिक डार्कनिंग प्रभाव से बदल देता है।
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();
}
});
मैंने कई बटन के लिए एक अलग वर्ग के रूप में इसे निकाला - केवल विचार प्राप्त करने के लिए अनाम आंतरिक वर्ग के रूप में दिखाया गया।