如何在android中blit()?

时间:2010-04-11 19:17:33

标签: android graphics canvas bitmap blit

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

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

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

2 个答案:

答案 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的定时函数,以便它不会一直运行。我建议看看月球来源。