我有一个硬件加速的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()。
当硬件加速 off 时,一切都按预期工作......当我反复点击按钮时,屏幕会循环显示蓝色,绿色,红色,蓝色,绿色,红色...
然而,当硬件加速打开时,颜色总是相同的 - 无论我第一次绘制它时的位图是什么颜色(上面代码为蓝色)。
这是预期的行为吗?我可以解决它吗?
根据基于我调用的createBitmap()重载的文档,位图是可变的。如果它不可变,则会抛出异常。此外,代码通常是正确的,正如我所描述的那样 - 它在硬件加速关闭时按预期工作。
非常感谢任何帮助。