ユーザーが空白のキャンバスに描画できる描画アプリがあります。現在のビットマップのスケーリングされた「サムネイル」を描画しようとしています。これにより、ユーザーがビューでスケーリングしたときに、サムネイルを参照して、描画キャンバス全体のどこにいるかを把握できます。スケーリングが機能しており、サムネイルを正しい場所に表示していますが、新しい線/形状が追加されたときに、後続の onDraw でサムネイルが更新されていないようです。
このビューの基になるビットマップにアクセスできるように (サムネイルを表示したり、ビットマップをファイルに簡単に保存したりできるようにするため)、ビューの onSizeChanged() で次のことを行います。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// set the canvas height, panning, etc, based on the now inflated View
mWidth = getWidth();
mHeight = getHeight();
mAspectRatio = mWidth / mHeight;
mPanX = 0;
mPanY = 0;
// create the Bitmap, set it to the canvas
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mCanvas.setBitmap(mBitmap);
draw(mCanvas);
}
次に、ユーザーが描画し、invalidate() が呼び出されると、onDraw() で次のようにしてサムネイルを生成します。
@Override
protected void onDraw(Canvas canvas) {
<snipped code that draws paths, shapes to canvas>
if (mScaled) {
Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int) thumbHeight, false);
canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint);
}
}
サムネイルは、thumbCanvasPaint を使用して、thumbnailRectF によって定義されたスペースに表示されますが、後続の onDraw() 呼び出しでは、フルサイズのアクティブなキャンバスにすべての描画などが表示されていても、スケーリングされたビットマップは元の状態から変更されていません。一部のテストでは、draw(mCanvas); への最初の呼び出しでビットマップを設定している間に、後続の onDraws が onSizeChanged() で指定されたものではなく、基になるビットマップに書き込んでいるように思えます。
だから、サイズ変更や保存などを実行するためにすぐにアクセスできるビットマップに onDraw キャンバスを結び付ける方法を理解しようとしていると思います。呼び出しは onDraw を mCanvas で指定されたビットマップ (私の場合は mBitmap) に関連付けますが、実際には、キャンバスへの更新に関する限り、機能していないようです。
ありがとう、
ポール