SurfaceView を拡張し、SurfaceHolder.Callback を実装するクラスがあります。onDraw() メソッドを使用して、キャンバスにいくつかのビットマップを描画しています。ボタンを押した後、invalidate() を呼び出してキャンバスに新しい画像を追加しています。新しい無効化()後に新しい画像を追加するが、以前のものを削除しないように、以前のすべての無効化()で行ったすべての変更を保存する可能性はありますか?
3 に答える
私が理解したことから、描かれた画像とその位置を保存したいと思うでしょうか? 私が提供したコードを使用すると、画像と位置で満たされたリストが得られます。リストは順不同です。順序付きリストが必要な場合は、LinkedList
代わりに a を使用できます。
新しいクラスを作成します。名前は何でもかまいません。
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);
}
あなたが何を使っているのかわからないので、ビットマップとドローアブルの両方を追加しました。保存した画像で何をしたいのかわからないため、これ以上コードを投稿できませんでした。より多くの情報がさらに役立つ可能性があります。
これは、以前のキャンバスを保存するためにビットマップを使用する非常に簡単なケースです。キャンバスにビットマップを添付するだけです。描画する前に、古いビットマップを「prevBitmap」などに保存してから、その上に描画します。canvas.drawBitmap(prevBitmap); を呼び出して、前のビットマップを再描画できます。
古い絵をキャンバスに保存して、新しい絵を追加するときに再度描く必要はありません。左上の点の座標 (x, y) とサイズ (sizeX, sizeY) を持つ新しい画像をビューのキャンバスに追加する必要がある場合は、invalidate(x, y, x+sizeX, y+sizeY) を呼び出すだけです。すべての画像を配列に保存しようとすると、すでに回答が得られています。PS私の英語で申し訳ありませんが、役に立てば幸いです