我试图确定在Android SurfaceView上滚动由平铺位图组成的背景的"最佳"方式.我实际上已经成功地这样做了,但想确定是否有更高效的技术,或者我的技术可能不适用于所有Android手机.
基本上,我创建了一个新的,可变的Bitmap,它比SurfaceView的尺寸略大.具体来说,我的Bitmap可以容纳顶部,底部,左侧和右侧的额外线条.我在我的新位图周围创建了一个画布,并绘制了我的位图图块.然后,我可以通过将我的背景位图的"Surfaceview大小"子集绘制到SurfaceHolder的画布,向上滚动到任何方向的图块.
我的问题是:
有没有比将背景位图绘制到SurfaceHolder画布更好的位blit技术?
当我滚动到背景位图的边缘并希望将地图移动一个图块长度时,最佳操作方法是什么?在我看来,我的选择是:
一个.单独重绘我背景中的所有图块,在一个方向上移动图块长度.(这让我觉得效率低下,因为它需要很多小的Bitmap绘制).
湾 只需使背景位图如此之大,以至于它将包含整个滚动世界.(这可能需要一个非常大的位图,但它只需要创建一次.)
C.复制背景位图,将其绘制到自身上,但在我们滚动的方向上移动一个图块长度,并使用几个单独的位图绘制绘制新显示的图块行或列.(这里我假设一个大位图绘制比覆盖相同范围的多个小位图更有效.)
感谢您阅读所有这些,我将非常感谢任何建议.
我在我的摩托罗拉Droid上测试了它,它按预期工作.但是,我担心这可能是:
码:
/* Create a simple 100 by 100 bitmap */
Bitmap myBitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
/* Create a canvas with which to draw on my bitmap */
Canvas myCanvas = new Canvas(myBitmap);
/* Draw a subset of my bitmap onto itself, with the source rectangle and destination rectangle overlapping */
Rect sourceRect = new Rect(10, 0, 99, 99);
Rect destRect = new Rect(0, 0, 89, 99);
myCanvas.drawBitmap(myBitmap, sourceRect, destRect, null);
Run Code Online (Sandbox Code Playgroud)
正如我所说,这似乎在我的测试中运行良好,但是当在其他平台上执行bit blits时,我并不总能保证将一个grpahics区域复制到另一个grpahics区域是安全的,内存和性能方面的.源和目的地相交.
我欢迎任何有关此事的见解.
android ×2