我习惯于使用老式库(allegro、GD、pygame)处理图形,如果我想将位图的一部分复制到另一个库中……我只使用 blit。
我试图弄清楚如何在android中做到这一点,我很困惑。所以......我们有这些只写的画布和只读的位图?这似乎太愚蠢了,不可能是真实的,一定是我错过了什么,但我真的想不通。
编辑:更准确地说...如果位图是只读的,而画布是只写的,我不能将 A 插入 B,然后将 B 插入 C?
将一个位图复制到另一个位图的代码如下:
Rect src = new Rect(0, 0, 50, 50);
Rect dst = new Rect(50, 50, 200, 200);
canvas.drawBitmap(originalBitmap, src, dst, null);
这指定您要复制位图的左上角 (50x50),然后将其拉伸为 150x150 位图,并将其写入距画布左上角 50 像素的偏移量。
您可以通过 invalidate() 触发绘图,但如果您正在制作动画,我建议您使用 SurfaceView。无效的问题是它只在线程空闲时绘制,所以你不能在循环中使用它——它只会绘制最后一帧。以下是我回答的有关图形的其他问题的一些链接,它们可能有助于解释我的意思。
作为对评论的回应,这里有更多信息:如果您从 SurfaceHolder.lockCanvas() 获取 Canvas,那么我认为您不能将其中的残留数据复制到位图中。但这不是该控件的用途-您仅在将所有内容整理好并准备绘图时使用。
你想要做的是创建一个画布,使用
Canvas canvas = new Canvas(yourBitmap)
然后,您可以进行任何您想要的转换和绘图操作。yourBitmap 将包含所有最新信息。然后你像这样使用表面支架:
Canvas someOtherCanvas = surfaceHolder.lockCanvas()
someOtherCanvas.drawBitmap(yourBitmap, ....)
这样一来,您始终拥有 yourBitmap ,其中包含您要保留的任何信息。
在 android 中,您绘制到画布,当您希望它更新时,您调用 invalidate 它将将此画布重绘到屏幕上。所以我猜你已经覆盖了视图的 onDraw 方法,所以只需添加 invalidate();
@Override
public void onDraw(Canvas canvas) {
// Draw a bitmap to the canvas at 0,0
canvas.drawBitmap(mBitmap, 0, 0, null);
// Add in your drawing functions here
super.onDraw(canvas);
// Call invalidate to draw to screen
invalidate();
}
上面的代码只是不断地重绘位图,当然你想添加额外的东西来绘制并考虑使用一个调用invalidate的计时函数,这样它就不会一直运行。我建议你看看 lunarlander 的来源。