8

ユーザーが空白のキャンバスに描画できる描画アプリがあります。現在のビットマップのスケーリングされた「サムネイル」を描画しようとしています。これにより、ユーザーがビューでスケーリングしたときに、サムネイルを参照して、描画キャンバス全体のどこにいるかを把握できます。スケーリングが機能しており、サムネイルを正しい場所に表示していますが、新しい線/形状が追加されたときに、後続の 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) に関連付けますが、実際には、キャンバスへの更新に関する限り、機能していないようです。

ありがとう、

ポール

4

2 に答える 2

9
canvas.drawBitmap(out, null, thumbnailRectF, thumbCanvasPaint); 

に変更する必要があります

canvas.drawBitmap(out, new Rect(0,0,mBitmap.getWidht, mBitmap.getheight), thumbnailRectF, thumbCanvasPaint);

の必要はありません

Bitmap out = Bitmap.createScaledBitmap(mBitmap, (int) thumbWidth, (int)....

また、ズームが 1 より大きい場合は常に mScaled が true であることを確認してください

于 2011-02-08T01:49:54.997 に答える
3

ビットマップをスケーリングしてBitmap.createScaledBitmapから描画すると機能しません

キャンバスビットマップをスケーリングするための解決策は、この関数を使用することです(ドキュメントから)

void drawBitmap (Bitmap bitmap,  Rect src, Rect dst, Paint paint)
// dst : Rect: The rectangle that the bitmap will be scaled/translated to fit into

のサイズを変更するとdst、ビットマップのサイズが変わります

左上にビットマップを描画し、それをスケーリングする場合の例を次に示します100px x 120px

Bitmap bitmap = BitmapFactory.decodeResource(...);//bitmap to be drawn

float left = 0;
float top = 0;
RectF dst = new RectF(left, top, left + 100, top + 120); // width=100, height=120

canvas.drawBitmap(bitmap, null, dst, null);
于 2016-11-30T09:27:34.583 に答える