나는 @conjugatedirection과 @Tomasz의 이전 답변에서 컬러 필터 제안을 좋아합니다. 그러나 지금까지 제공된 코드가 예상대로 쉽게 적용되지 않는다는 것을 알았습니다.
먼저, 컬러 필터를 적용하고 지우는 위치 에 대해서는 언급하지 않았습니다 . 이것을 할 수있는 다른 좋은 장소가있을 수 있지만, 나를 위해 떠오른 것은 OnTouchListener 입니다.
원래 질문을 읽었을 때 이상적인 솔루션은 이미지가 포함되지 않은 솔루션입니다. @emmby의 custom_button.xml을 사용하여 허용되는 대답은 목표 인 경우 컬러 필터보다 적합합니다. 필자의 경우 버튼의 모양을 UI 디자이너의 png 이미지로 시작합니다. 버튼 배경을이 이미지로 설정하면 기본 하이라이트 피드백이 완전히 손실됩니다. 이 코드는 해당 동작을 프로그래밍 방식의 어두운 효과로 대체합니다.
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();
}
});
나는 이것을 여러 버튼에 적용하기위한 별도의 클래스로 추출했습니다-아이디어를 얻기 위해 익명의 내부 클래스로 표시됩니다.