Android 在位图中保存画布,然后使用该位图

Android 在位图中保存画布,然后使用该位图,android,bitmap,android-canvas,Android,Bitmap,Android Canvas,我有一张画布: Canvas c=null; 一个循环画了一个矩形,因为每次循环我都会改变矩形的位置,矩形会在屏幕上移动 int i=0; while(isRunning){ i++; c=null; Paint p=new Paint(); p.setColor(Color.BLACK); c.drawRect(i,i,i+5,i+5,p); } 我想创建一个backgorund,例如本例(一个大的蓝色矩形覆盖整个屏幕): 背景在循环之前创建(在我创建移动的矩

我有一张画布:

Canvas c=null;
一个循环画了一个矩形,因为每次循环我都会改变矩形的位置,矩形会在屏幕上移动

int i=0;
while(isRunning){
   i++;
   c=null;
   Paint p=new Paint();
   p.setColor(Color.BLACK);
   c.drawRect(i,i,i+5,i+5,p);
}
我想创建一个backgorund,例如本例(一个大的蓝色矩形覆盖整个屏幕):

背景在循环之前创建(在我创建移动的矩形之前)

现在我想做的是将画布与背景(蓝色大矩形)保存在位图上,然后在循环中绘制在位图上移动的小矩形,这样它将绘制矩形,它将移动并绘制背景(因此将有移动的矩形和背景)

如何在位图上保存画布,然后在循环中的画布上绘制位图


如果您不介意的话,可以发布一个代码来实现我在示例中所描述的功能。

如果不将画布保存到位图,则需要从一开始就将画布写入位图

Canvas canvas = new Canvas(bitmap);

这将使画布写入内存中的位图。然后只需使用该画布进行绘制。

如果您只想在普通颜色的背景上绘制矩形,您可以尝试以下方法:

private Paint rectPaint = new Paint();
private Rect rect = new Rect(0, 0, 5, 5);

protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.BLUE);
    canvas.drawRect(rect, rectPaint);
}
此代码尚未移动您的rect。您可以使用以下方法向先前定义的rect添加偏移量,从而在画布上移动它

public void moveRect(int dx,int dy){
    rect.offset(dx, dy);
}
具体发生在哪里取决于代码的其余部分。(可能每次调用onDraw()时?)

如果您的目标是在画布上绘制不同的位图,则应尝试此方法

canvas.drawBitmap(bitmap, left, top, paint);
为此,您可以从以下资源加载位图:

Bitmap backgroundBitmap = BitmapFactory.decodeResource(context,
            R.drawable.your_background_bitmap);
或初始化空位图并使用画布绘制到该位图:

Bitmap backgroundBitmap = Bitmap.createBitmap(getWidth(), getHeight(),
            Config.ARGB_8888);
Canvas backgroundCanvas = new Canvas(backgroundBitmap);
backgroundCanvas.drawColor(Color.BLUE);

如果您有更多关于代码内容的信息(例如,自定义视图、游戏循环),我可以帮助您提供更精确的答案。

但它不会在循环的每一轮都更改位图吗?我的意思是,它不仅可以保存背景,还可以保存循环中移动每一圈的矩形?所以它不是移动rect,而是复制它?
Bitmap backgroundBitmap = Bitmap.createBitmap(getWidth(), getHeight(),
            Config.ARGB_8888);
Canvas backgroundCanvas = new Canvas(backgroundBitmap);
backgroundCanvas.drawColor(Color.BLUE);