Рисунки на холсте и масштабирование по центру - PullRequest
2 голосов
/ 01 февраля 2012

Я играю с 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 голосов
/ 22 июля 2015

Простое решение

 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();
    }

}

}

...