Android:Canvas不缩放

时间:2013-01-21 15:22:27

标签: android canvas bitmap scale android-custom-view

我有一个自定义视图,它在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();
}

知道我哪里错了...... ???

1 个答案:

答案 0 :(得分: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();
}

然后您将绘图大小基于画布大小。因此,当您缩放画布时,仍然会将其绘制为整个大小,然后调整回原来的大小。因此没有任何影响。

您需要做的是将画布尺寸 BEFORE 缩放,然后将其传递给您的draw方法。然后使用这些尺寸绘制到画布上。