Drawableの色を(無効な状態を示すために)グレースケールのものに変える正しい方法は何でしょうか?
編集:
B/W =>グレースケール
この質問が少し前に行われたことは知っていますが、Drawableがあり、同じDrawableをグレースケールで表示したい場合に機能するより簡単なソリューションに出くわしました。キャンバスやペインターを持っている必要はありません...
protected Drawable convertToGrayscale(Drawable drawable)
{
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
drawable.setColorFilter(filter);
return drawable;
}
これもお役に立てば幸いです。
どうやら、ColorMatrix
クラスを使用して、あらゆる種類の色空間変換を行うことができます。 setSaturation()
メソッドがあり、カラーからグレースケールへの変換(彩度をゼロにする)を簡単に作成できます。
したがって、そのフィルターを使用して、画像の新しいコピーをペイントできます。私はこれを試していませんが、うまくいくはずです:
Bitmap grayscaleBitmap = Bitmap.createBitmap(
colorBitmap.getWidth(), colorBitmap.getHeight(),
Bitmap.Config.RGB_565);
Canvas c = new Canvas(grayscaleBitmap);
Paint p = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(cm);
p.setColorFilter(filter);
c.drawBitmap(colorBitmap, 0, 0, p);
@intgrの答えに対するいくつかのコメント。
1。 Bitmap.Config.ARGB_8888
アルファチャネルを保持します。
2。少し余分なコード:
//remember, you are converting a .png image, as opposed to a Drawable defined in .xml
Bitmap colorBitmap = ((BitmapDrawable)drawable).getBitmap();
// the code by intgr
Drawable grayscaleDrawable = new BitmapDrawable(grayscaleBitmap);
無効にしたバージョンの画像だけでなく、プログラムでこれを実行したいですか?次のようなXMLドローアブルを参照できます。
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_window_focused="false" Android:state_enabled="true"
Android:drawable="@drawable/btn_default_normal" />
<item Android:state_window_focused="false" Android:state_enabled="false"
Android:drawable="@drawable/btn_default_normal_disable" />
<item Android:state_pressed="true"
Android:drawable="@drawable/btn_default_pressed" />
<item Android:state_focused="true" Android:state_enabled="true"
Android:drawable="@drawable/btn_default_selected" />
<item Android:state_enabled="true"
Android:drawable="@drawable/btn_default_normal" />
<item Android:state_focused="true"
Android:drawable="@drawable/btn_default_normal_disable_focused" />
<item
Android:drawable="@drawable/btn_default_normal_disable" />
</selector>