我习惯用老式图书馆处理图形(allegro,GD,pygame),如果我想将一个位图的一部分复制到另一个......我只是使用blit。
我正试图弄清楚如何在Android中做到这一点,我感到非常困惑。 那么......我们将这些Canvas设置为只写,Bitmaps是只读的吗?看起来真的太愚蠢了,一定有一些我想念的东西,但我真的无法理解。
编辑:更精确...... 如果位图是只读的,并且画布是只写的,我不能将A插入B,然后B插入C?< /强>
答案 0 :(得分:17)
将一个位图复制到另一个位图的代码如下:
Rect src = new Rect(0, 0, 50, 50);
Rect dst = new Rect(50, 50, 200, 200);
canvas.drawBitmap(originalBitmap, src, dst, null);
指定要复制位图的左上角(50x50),然后将其拉伸到150x150位图并将其写入画布左上角50px偏移量。
您可以通过invalidate()触发绘图,但如果您正在制作动画,我建议您使用SurfaceView。 invalidate的问题是它只在线程空闲时才绘制,所以你不能在循环中使用它 - 它只会绘制最后一帧。以下是我回答过关于图形的其他问题的一些链接,它们可能有助于解释我的意思。
在回应评论时,这里有更多信息: 如果你从SurfaceHolder.lockCanvas()获得Canvas,那么我认为你不能将其中的残留数据复制到Bitmap中。但这不是那种控制的目的 - 你只使用而不是当你把所有东西都分类出来并准备好画画时。
您要做的是创建一个使用
绘制到位图的画布Canvas canvas = new Canvas(yourBitmap)
然后,您可以执行任何转换并绘制所需的操作。 yourBitmap将包含所有最新信息。 然后你就像这样使用表面支架:
Canvas someOtherCanvas = surfaceHolder.lockCanvas()
someOtherCanvas.drawBitmap(yourBitmap, ....)
通过这种方式,你总是得到yourBitmap,其中包含你想要保留的任何信息。
答案 1 :(得分:-1)
在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的定时函数,以便它不会一直运行。我建议看看月球来源。