2011-07-15 9 views
5

描画可能なアルファ値を押したときに変更したい。 したがって、2つのドロウアブルを作成し、それらをStateListDrawableに入れ、押した状態のアルファ値を設定します。しかし、それは動作しません。StateListDrawableでdrawableのアルファ値を設定する方法は?

StateListDrawable content = new StateListDrawable(); 
Drawable contentSelected = this.getResources().getDrawable(
R.drawable.content_background); 
contentSelected.mutate().setAlpha(100); 

Drawable contentNormal = this.getResources().getDrawable(R.drawable.content_background); 

content.addState(new int[] { android.R.attr.state_pressed }, contentSelected); 
content.addState(new int[] { android.R.attr.state_enabled }, contentNormal); 

ImageButton button = (ImageButton) view.findViewById(R.id.content_thumbnail); 
button.setImageDrawable(content); 

更新: 私の最終的な解決策は、このようなBitmapDrawableのサブクラスを作成 とonStateChange()方法でアルファ値を変更することです。

public AlphaAnimatedDrawable(Resources res, Bitmap bitmap) { 
    super(res, bitmap); 
    this.setState(new int[] { android.R.attr.state_pressed, android.R.attr.state_selected, 
      android.R.attr.state_enabled }); 
} 

private static final int PRESSED_ALPHA = 180; 
private static final int REGULAR_ALPHA = 255; 

@Override 
protected boolean onStateChange(int[] states) { 

    for (int state : states) { 
     if (state == android.R.attr.state_pressed) { 
      setAlpha(PRESSED_ALPHA); 
     } else if (state == android.R.attr.state_selected) { 
      setAlpha(REGULAR_ALPHA); 
     } else if (state == android.R.attr.state_enabled) { 
      setAlpha(REGULAR_ALPHA); 
     } 
    } 
    return true; 
} 
+0

Argのために働いていた、私はちょうど同じ問題をヒット!私はそれを修正すればあなたにお知らせしようとします! –

+0

助けてくれました。 Drawableを拡張する場合は、@Overrideも必要です。 public boolean isStateful(){ return true; } –

答えて

6

これは私

StateListDrawable drawable = new StateListDrawable(); 

    Bitmap enabledBitmap = ((BitmapDrawable)mIcon).getBitmap(); 

    // Setting alpha directly just didn't work, so we draw a new bitmap! 
    Bitmap disabledBitmap = Bitmap.createBitmap(
     mIcon.getIntrinsicWidth(), 
     mIcon.getIntrinsicHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(disabledBitmap); 

    Paint paint = new Paint(); 
    paint.setAlpha(126); 
    canvas.drawBitmap(enabledBitmap, 0, 0, paint); 

    BitmapDrawable disabled = new BitmapDrawable(mContext.getResources(), disabledBitmap); 

    drawable.addState(new int[] { -android.R.attr.state_enabled}, disabled); 
    drawable.addState(StateSet.WILD_CARD, mIcon); 
+0

これはうまくいきますが、ビットマップを作成することは常にあなたのメモリ上の大きな窪みです –

関連する問題