我有自定义复选框PNG。我没有创建禁用的图像;相反,自定义绘图,当绘制禁用复选框时,设置"灰色"过滤到状态列表drawable然后绘制它。直到版本4.4.4,这很有效。不幸的是,在Android L中,一旦绘制了禁用的复选框,此颜色过滤器会在重绘后立即应用于所有复选框。
我想知道Android L中的绘图是否发生在多个线程中。这是我能找到的唯一解释"传播"滤色器到其他复选框...
答案 0 :(得分:1)
这是一种优化,因为Android正在缓存绘制的图像,然后只是重新使用缓存的图像。你说你已经有了一个可绘制的状态列表,所以你应该只为state enabled =“false”添加状态图像。
答案 1 :(得分:0)
在Android L中,有两个处理UI的线程:主(UI工具包)线程和渲染线程。 Render线程对L来说是新的,并且特定于Animations。 Threads in Android
答案 2 :(得分:0)
我明白了。可能对其他人有所帮助。这可能是Android L中的一个错误。
Canvas.drawBitmap(Bitmap, Rect, RectF, Paint)
函数,如果Paint
参数包含滤色器,则使用应用的滤镜缓存图像的复制部分。下次绘制Bitmap
的相同部分时,即使Paint
包含null
颜色过滤器,也会使用缓存中的图像。为了避免这种影响,您需要在drawBitmap
中使用不同的非空滤色器Paint
。我从身份矩阵创建了一个颜色过滤器,如下所示。
private static final float[] arrEmptyFilter =
{
1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0
};
ColorMatrixColorFilter emptyFilter = Build.VERSION.SDK_INT >= 21 ?
new ColorMatrixColorFilter(arrEmptyFilter) : null;
然后到处都是,我没有将paint的颜色过滤器设置为null,而是将其设置为emptyFilter
。问题解决了。
我不知道其他版本的drawBitmap()