因此,我试图了解如何在自定义View
中正确使用硬件加速(如果可用),并持续动画。这是我onDraw()
的基本前提:在自定义视图中使用硬件层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()
禁用它们,但我想知道我是否我真正使用它。本质上,调用drawBitmap()
的i/j
循环从不改变;唯一改变的是Canvas
翻译。 Bitmap
是否在幕后自动保存到GPU中,或者是否有需要手动执行的操作?
相反我可能误解了这个问题但你有没有设置'setLayerType(View.LAYER_TYPE_HARDWARE,null);'为你的视图? GPU只在用户正在进行滚动时才会缓存图像,但不会作为消耗较少资源的权衡。 – Slartibartfast
@Slartibartfast是的,我已将图层类型设置为硬件。用户将永远不会滚动;视图不断滚动自己的内容。我可能误解了HW Acceleration,但我觉得我正在绘制的位图网格应该能够渲染到硬件层,并且只需转换而不是在每一帧上重新绘制位图。 – kcoppock