2014-04-22 3 views
3

StateListDrawable은 포함하고있는 드로어 블에 적용된 컬러 필터를 무시합니다. 예를 들면 :StateListDrawable의 특정 드로어 블에 컬러 필터를 적용하는 방법은 무엇입니까?

StateListDrawable sld = new StateListDrawable(); 
Drawable pressedState = Context.getResources().getDrawable(R.drawable.solid_green); 

pressedState.setColorFilter(Color.RED, PorterDuff.Mode.SRC); 

sld.addState(new int[] {android.R.attr.state_pressed}, pressedState); 
// Other states... 

당신이보기의 배경에 sld을 적용하면, 당신이 그것을 누를 때 뷰의 배경이 빨간색으로 설정하는 기대. 대신 필터가 적용되지 않은 pressedState의 색이 초록색으로 변합니다.

답변

5

이 문제를 해결하려면 드로어 블이있는 상태를 기준으로 StateListDrawable 자체에 컬러 필터를 적용해야합니다. 다음 확장명이 StateListDrawable입니다.

public class SelectorDrawable extends StateListDrawable { 

    public SelectorDrawable(Context c) { 
     super(); 

     addState(new int[] {android.R.attr.state_pressed}, c.getResources().getDrawable(R.drawable.solid_green)); 
     // Other states... 
    } 

    @Override 
    protected boolean onStateChange(int[] states) { 
     boolean isClicked = false; 
     for (int state : states) { 
      if (state == android.R.attr.state_pressed) { 
       isClicked = true; 
      } 
     } 

     if (isClicked) 
      setColorFilter(Color.RED, PorterDuff.Mode.SRC); 
     else 
      clearColorFilter(); 

     return super.onStateChange(states); 
    } 
} 

onStateChange(int[] states)의 논리는 눌려진 상태 이상을 테스트하도록 추가로 확장 될 수 있으며, 다른 컬러 필터를 적절히 적용 할 수있다.

관련 문제