オンザフライで画像の変更を行う必要があるアプリケーションを作成しています。
私がしなければならないことは、画面のどこかにドローアブルを配置し、その場で変更できる派手な色を付けて、(StateListDrawable を使用して) クリックできるようにすることです。
その場で色を変更するには、ドローアブルに適用する PorterDuffColorFilter を使用することを考えていました。ただし、カラー フィルターが削除されるため、StateListDrawable にドローアブルを追加することはお勧めできません。しかし、その後、SOのどこかで見つけたこのソリューションを思いつきました:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap one = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable, options);
Bitmap oneCopy = Bitmap.createBitmap(one.getWidth(), one.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(oneCopy);
Paint p = new Paint();
p.setColorFilter(new PorterDuffColorFilter(onTheFlyColorResId, PorterDuff.Mode.SRC_ATOP));
c.drawBitmap(one, 0, 0, p);
...
sld.addState(new int[]{-stateFocused}, new BitmapDrawable(context.getResources(), oneCopy));
この種の作品ですが、注意が必要な点が 1 つあります。下の画像は結果ですが、 R.drawable.my_drawable は全体が黒で、周囲に 3px の透明な境界線がある PNG ファイルです。
元のドローアブルを追加するだけで、以下のように側面に透明なピクセルがいくつかある完全な黒の画像が得られます。
sld.addState(new int[]{-stateFocused}, context.getResources().getDrawable(R.drawable.my_drawable));
そして、これは結果です:
そのため、oneCopy ビットマットまたはキャンバス上の描画に何か問題があるのではないかと考えていたので、コードを次のように変更します。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap one = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable, options);
...
sld.addState(new int[]{-stateFocused}, new BitmapDrawable(context.getResources(), one));
したがって、ドローアブルの変換はもう必要ありません。ビットマップとして読み取り、再度ドローアブルに変換するだけでも、奇妙な結果になります。
そして、私が単純に望むのは、カスタム カラーが適用された 2 番目の画像です。
画像の左右に奇妙なフェード効果が発生する理由を知っている人はいますか?