我有一个硬件加速的 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() 重载的文档,位图是可变的。如果它不是可变的,则会抛出异常。此外,正如我所描述的那样,代码通常是正确的——当硬件加速关闭时,它会按预期工作。
任何帮助将非常感激。