我正在编写一个应用程序,我必须在其中进行一些即时图像突变。
我要做的是在屏幕上的某个地方放置一个drawable,给它一个可以动态更改的花哨颜色并使其可点击(使用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));
这种工作,但有一个棘手的事情。下图是结果,而 R.drawable.my_drawable 是一个全黑的 PNG 文件,周围有 3px 透明边框。
如果我只是添加原始可绘制对象,我会得到一个全黑图像,侧面有一些透明像素,如下所示:
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));
因此不再对drawable进行转换,只是将其作为位图读取并再次将其转换为drawable也会导致奇怪的结果:
而我想要的只是应用了我的自定义颜色的第二张图像。
有谁知道为什么我会在图像的左右两侧得到奇怪的淡入淡出效果?