所以我试图了解如何在自定义中正确使用硬件加速(如果可用)View
那是持续的动画。这是我的基本前提onDraw()
:
canvas.drawColor(mBackgroundColor);
for (Layer layer : mLayers) {
canvas.save();
canvas.translate(layer.x, layer.y);
//Draw that number of images in a grid, offset by -1
for (int i = -1; i < layer.xCount - 1; i++) {
for (int j = -1; j < layer.yCount - 1; j++) {
canvas.drawBitmap(layer.bitmap, layer.w * i, layer.h * j, null);
}
}
//If the layer's x has moved past its width, reset back to a seamless position
layer.x += ((difference * layer.xSpeed) / 1000f);
float xOverlap = layer.x % layer.w;
if (xOverlap > 0) {
layer.x = xOverlap;
}
//If the layer's y has moved past its height, reset back to a seamless position
layer.y += ((difference * layer.ySpeed) / 1000f);
float yOverlap = layer.y % layer.h;
if (yOverlap > 0) {
layer.y = yOverlap;
}
canvas.restore();
}
//Redraw the view
ViewCompat.postInvalidateOnAnimation(this);
我正在启用硬件层onAttachedToWindow()
并禁用它们onDetachedFromWindow()
,但我试图了解我是否真的在使用它。本质上,i/j
循环调用drawBitmap()
永远不会改变;唯一改变的是Canvas
翻译。是个Bitmap
在幕后自动保存到 GPU 作为纹理,还是需要手动执行某些操作?
您正在设置什么视图View.LAYER_TYPE_HARDWARE
确切地?如果您在包含上面所示绘图代码的视图上设置硬件层,则会导致系统执行不必要的工作。由于您只绘制位图,因此无需在此处执行任何操作。如果你打电话Canvas.drawBitmap()
该框架将代表您缓存生成的 OpenGL 纹理。
不过,您可以进一步优化您的代码。而不是打电话drawBitmap()
,您可以使用子视图。如果您使用offset*()
方法(或setX()
/setY()
)框架将应用进一步的优化以避免调用draw()
再说方法。
一般来说,硬件层应该设置在绘制成本高昂且内容不会经常更改的视图上(因此与您正在做的事情几乎相反:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)