在surfaceView上保存更改每个invalidate()

时间:2013-02-04 15:37:39

标签: android android-canvas android-view

我有一个扩展SurfaceView并实现SurfaceHolder.Callback的类。使用onDraw()方法我在画布上绘制一些位图。按下按钮后,我将新图像添加到画布调用invalidate()。是否有可能保存我在之前的每个invalidate()上所做的所有更改,以便在new invalidate()添加新图像之后,但不删除之前的更新?

3 个答案:

答案 0 :(得分:1)

根据我的理解,你会想要保存所绘制的图像以及它的位置?通过使用我提供的代码,您将拥有一个填充图像和位置的列表。该清单无序;如果您想要一个有序列表,可以使用LinkedList代替。

创建一个新类,您可以将其命名为。

public class ImageHolder {
    private int mX;
    private int mY;
    private int mDrawableResource;
    private String mBitmapFilePath;

    public ImageHolder(int x, int y, int drawableResource, String bitmapFilePath) {
        mX = x;
        mY = y;
        mDrawableResource = drawableResource;
        mBitmapFilePath = bitmapFilePath;
    }

    public int getX() {
        return mX;
    }

    public int getY() {
        return mY;
    }

    public int getDrawableResource() {
        return mDrawableResource;
    }

    public String getBitmapFilePath() {
        return mBitmapFilePath;
    }
}

然后在SurfaceView中,每次绘制到列表时都会添加一个持有者。请注意,这是最低限度的代码,因此未添加任何同步。

private void customDrawMethod() {
        mImageHolders.add(new ImageHolder(x, y, drawableResource, bitmapFilePath));

        Canvas canvas = getHolder().lockCanvas();

        canvas.drawBitmap(bitmap, matrix, paint);

        getHolder().unlockCanvasAndPost(canvas);
    }

我添加了Bitmap和Drawable,因为我不确定你使用的是什么。我无法发布更多代码,因为我不知道您要对保存的图像做什么。更多信息可以帮助您进一步。

答案 1 :(得分:0)

使用Bitmaps存储以前的画布非常简单。只需将位图附加到画布上即可。在绘制之前,将旧位图保存为类似“prevBitmap”的内容,然后绘制它。您可以通过调用canvas.drawBitmap(prevBitmap);

来重绘先前的位图

答案 2 :(得分:0)

您可以在画布上保存旧图纸,并在添加新图片时不要再绘制它们。当您需要将具有左上角坐标(x,y)和大小(sizeX,sizeY)的新图像添加到View的画布时,只需调用invalidate(x,y,x + sizeX,y + sizeY)。即将保存所有图像,你已经得到答案。 附:对不起我的英文,希望这是有帮助的