Android中的所有绘图是否都发生在一个线程中?

时间:2015-02-01 04:05:12

标签: android drawable android-5.0-lollipop

我有自定义复选框PNG。我没有创建禁用的图像;相反,自定义绘图,当绘制禁用复选框时,设置"灰色"过滤到状态列表drawable然后绘制它。直到版本4.4.4,这很有效。不幸的是,在Android L中,一旦绘制了禁用的复选框,此颜色过滤器会在重绘后立即应用于所有复选框。

我想知道Android L中的绘图是否发生在多个线程中。这是我能找到的唯一解释"传播"滤色器到其他复选框...

3 个答案:

答案 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()