3

onDraw()でキャンバスにいくつかのビットマップを描画するカスタムビューがあります。図面は機能しています。コードスニペットを見てください:

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    canvas.save();

    if(appInitialized) {

        hsSide.draw(canvas);
        scaleA.draw(canvas);
        scaleB.draw(canvas);

    }
    canvas.scale(mScaleFactor, mScaleFactor, pivotX, pivotY);
    canvas.restore();
}

ピンチズームが画面に適用されたときにキャンバスを拡大縮小するScaleGestureListenerを実装しました。問題は、キャンバスがスケーリングされていないことです。キャンバスを拡大縮小するcanvas.scale(mScaleFactor, mScaleFactor, pivotX, pivotY);前に配置したが、その後に描画を配置すると、つまり拡大縮小されません。通常の縮尺で描画します。描画方法は次のとおりです。if(appInitialized) {hsSide.draw(canvas);

hsDide.draw:

@Override
public void draw(Canvas canvas) {
    // TODO Auto-generated method stub
    canvas.drawBitmap(mBitmap, canvas.getWidth()/2 - mBitmap.getWidth()/2, 0, null);
}

scaleA.draw:

@Override
public void draw(Canvas canvas) {
    // TODO Auto-generated method stub
    canvas.drawBitmap(mBitmap, canvas.getWidth()/2 - mBitmap.getWidth()/2, canvas.getHeight()/2 - mBitmap.getHeight()/2, null);
}

scaleB.draw:

@Override
public void draw(Canvas canvas) {
    // TODO Auto-generated method stub

    canvas.save();
    mMatrix.setRotate(currentAngle, canvas.getWidth()/2, canvas.getHeight()/2);
    canvas.setMatrix(mMatrix);
    canvas.drawBitmap(mBitmap, canvas.getWidth()/2 - mBitmap.getWidth()/2, canvas.getHeight()/2 - mBitmap.getHeight()/2, null);
    canvas.restore();
}

私がどこで間違っているのか考えてください...???

4

1 に答える 1

4

コードの実際を見て、キャンバスに描画する前にキャンバスを拡大縮小し、描画したら復元する必要があります。したがって、キャンバスのスケールを次のように移動します。

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    canvas.save();

   canvas.scale(mScaleFactor, mScaleFactor, pivotX, pivotY); // MOVED HERE.

    if(appInitialized) {

        hsSide.draw(canvas);
        scaleA.draw(canvas);
        scaleB.draw(canvas);

    }

    canvas.restore();
}

次に、描画サイズをキャンバスサイズに基づいて作成します。したがって、キャンバスを拡大縮小する場合でも、キャンバスを全体のサイズに描画してから、通常のサイズにサイズ変更します。したがって、効果はありません。

必要なのは、スケーリングする前にキャンバスサイズを取得し、これを描画メ​​ソッドにも渡すことです。次に、それらのサイズを使用してキャンバスに描画します。

于 2013-01-21T17:17:38.633 に答える