如何在android中blit()?

o0'*_*0'. 14 graphics android canvas bitmap blit

我习惯用老式图书馆处理图形(allegro,GD,pygame),如果我想将一个位图的一部分复制到另一个......我只是使用blit.

我想弄清楚如何在android中做到这一点,我感到非常困惑.那么......我们将这些Canvas设置为只写,Bitmaps是只读的吗?看起来真是太愚蠢了,必须有一些我想念的东西,但我真的无法理解.

编辑:更精确一点...... 如果位图是只读的,而且画布只是写入的,我不能将A插入B,然后将B插入C?

Ste*_*ley 17

将一个位图复制到另一个位图的代码如下:

Rect src = new Rect(0, 0, 50, 50); 
Rect dst = new Rect(50, 50, 200, 200);  
canvas.drawBitmap(originalBitmap, src, dst, null);
Run Code Online (Sandbox Code Playgroud)

这指定您要复制位图的左上角(50x50),然后将其拉伸到150x150位图并将其从画布的左上角写入50px偏移量.

您可以通过invalidate()触发绘图,但如果您正在制作动画,我建议您使用SurfaceView.invalidate的问题是它只在线程空闲时才绘制,所以你不能在循环中使用它 - 它只会绘制最后一帧.以下是我回答过有关图形的其他问题的一些链接,它们可能有助于解释我的意思.


回应这些评论,这里有更多信息:如果你从SurfaceHolder.lockCanvas()获得Canvas,那么我认为你不能将其中的残留数据复制到Bitmap中.但这不是那种控制的目的 - 你只使用而不是当你把所有东西都分类出来并准备好画画时.

你想要做的是创建一个使用绘制到位图的画布

Canvas canvas = new Canvas(yourBitmap)
Run Code Online (Sandbox Code Playgroud)

然后,您可以执行任何转换并绘制所需的操作.yourBitmap将包含所有最新信息.然后你像这样使用表面支架:

Canvas someOtherCanvas = surfaceHolder.lockCanvas()
someOtherCanvas.drawBitmap(yourBitmap, ....)
Run Code Online (Sandbox Code Playgroud)

这样你总是得到yourBitmap,其中包含你想要保留的任何信息.