Canvas drawables和居中缩放

时间:2012-02-01 17:59:01

标签: android view touch scaling android-canvas

我正在玩Google tutorial来为我的画布实现缩放功能。我在画布上绘制了几个项目,我可以通过Canvas.translate(dx,dy)和项目一起移动它。为了让我确定在画布翻译后是否触摸了这些项目,我将使用用于Canvas.translate(dx,dy)的画布偏移量并减去触摸位置。一旦我在图片中引入缩放,就会有点棘手。如果我使用Canvas.scale(sx,sy)并在量表工作完美后执行(touchX-offsetX)/scaleFactor触摸位置的转换。但是,如果包含一个枢轴位置Canvas.scale(sx,sy,px,py),则上面的代码不起作用。作为触摸翻译的一部分,我如何将枢轴位置考虑在内?我通过执行以下操作来设置我的支点位置,

    public boolean onScaleBegin(ScaleGestureDetector detector) {
    mScaleX = detector.getFocusX();
    mScaleY = detector.getFocusY();
    return true;
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

简单的解决方案

 public class ScalableImageView extends View {
    Matrix drawMatrix = new Matrix();
    ScaleGestureDetector detector;
    public ScalableImageView(Context context, AttributeSet attrs) { 
         @Override
        public boolean onScale(ScaleGestureDetector detector) {

            drawMatrix.postScale(detector.getScaleFactor(), detector.getScaleFactor(), detector.getFocusX(), detector.getFocusY());
            invalidate();
            return true;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            return drawMatrix != null;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {

        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.save();
        canvas.concat(drawMatrix);
        // ... draw here
        // for example drawable.draw()
        canvas.restore();
    }

}

}