Рисование на холсте и масштабирование по центру

Я использую руководство Google, чтобы реализовать возможности масштабирования на моем холсте. Я рисую несколько элементов на холсте и могу перемещать их с помощью 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;
}

Любая помощь будет принята с благодарностью.


person serveace6    schedule 01.02.2012    source источник


Ответы (1)


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

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

}

}

person Roman Sinelnikov    schedule 22.07.2015