1

我有一个硬件加速的 Android 应用程序(清单中的 android:hardwareAccelerated="true")。我注意到有问题的行为,我归结为下面的测试程序。

我发现,当我创建一个 Bitmap 对象,然后每次调用我的自定义视图的 onDraw() 时更改它的内容时,渲染到屏幕上的位图内容始终保持第一次绘制位图时的状态。这是我自定义视图的 onDraw() 中的代码:

protected void onDraw(Canvas canvas) 
{       
    if (m_bFirstDraw)
    {
        // This code is only run one time.  It creates three pixel arrays: blue, green, and red
        // Also a single bitmap object is created, to be modified and re-used in every onDraw() call.
        m_bFirstDraw = false;
        for (int i=0; i<3; i++)
        {
            m_aaiImage[i] = new int[this.getWidth() * this.getHeight()];
            Arrays.fill(m_aaiImage[i], 0xFF << (i*8));
        }

        m_bmp = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.RGB_565);        
    }

    // Now every time through the loop, use a different color       
    m_bmp.setPixels(m_aaiImage[m_iDrawNum%3], 0, getWidth(), 0, 0, getWidth(), getHeight());    
    canvas.drawBitmap(m_bmp, 0, 0, null);

    m_iDrawNum++;
}

在其他地方,我有一个按钮,单击该按钮时仅在我的自定义视图上调用 invalidate(),从而导致调用 onDraw()。

当硬件加速关闭时,一切都按预期工作......当我反复点击按钮时,屏幕在蓝色、绿色、红色、蓝色、绿色、红色之间循环......

然而,当硬件加速开启时,颜色总是相同的——无论我第一次绘制位图时的颜色是什么(上面的代码是蓝色的)。

这是预期的行为吗?我可以解决它吗?

根据基于我调用的 createBitmap() 重载的文档,位图是可变的。如果它不是可变的,则会抛出异常。此外,正如我所描述的那样,代码通常是正确的——当硬件加速关闭时,它会按预期工作。

任何帮助将非常感激。

4

0 回答 0