0

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

4

3 回答 3

1

据我了解,您将要保存绘制的图像及其位置?通过使用我提供的代码,您将拥有一个包含图像和位置的列表。列表是无序的;如果你想要一个有序列表,你可以使用 aLinkedList代替。

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

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,因为我不确定您使用的是什么。我无法发布更多代码,因为我不知道您想对保存的图像做什么。更多信息可以进一步帮助您。

于 2013-02-04T15:55:00.673 回答
0

这是使用位图存储您以前的画布的非常简单的案例。只需将位图附加到您的画布上。在绘制之前,将旧位图保存到类似“prevBitmap”的位置,然后在上面绘制。您可以通过调用 canvas.drawBitmap(prevBitmap); 重绘之前的 Bitmap;

于 2013-02-05T03:51:51.083 回答
0

您可以将旧图纸保存在画布上,添加新图片时不要再次绘制它们。当您需要将具有左上点坐标 (x, y) 和大小 (sizeX, sizeY) 的新图像添加到视图的画布时,只需调用 invalidate(x, y, x+sizeX, y+sizeY) 即可。即将将所有图像保存在您已经得到答案的数组中。PS对不起我的英语,希望它有帮助

于 2013-03-22T10:58:40.897 回答