Android-холст Pinch to Zoom с точкой поворота - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь реализовать Pinch to Zoom to position.Я работаю над этим уже неделю и не могу понять.

Вот моя проблема:

Я создал пользовательское представление, расширяющее SurfaceView и реализующее ScalingGestureDetector.Все работает нормально, хотя я еще не масштабировал свой холст, или точки поворота такие же, как в предыдущем масштабировании.Когда точка поворота отличается от предыдущей шкалы, холст переходит в другое положение x, y и масштабируется до точки фокуса пальца.Я не могу использовать матрицу, потому что я рисую текст и тексты, а не растровое изображение.

Вот мой код

public class CustomSurfaceView extends SurfaceView implements SurfaceHolder.Callback, ScaleGestureDetector.OnScaleGestureListener {
    private ScaleGestureDetector mScaleDetector;
    private float focusX, focusY;
    private float scale = 1f;

    private void init(Context context) {
        mScaleDetector = new ScaleGestureDetector(context, this);
        getHolder().addCallback(this);

        // other init code
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        tryDrawing(holder);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int frmt, int w, int h) {
        tryDrawing(holder);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {}

    public void tryDrawing() {
        tryDrawing(getHolder());
    }

    private void drawMyStuff(final Canvas canvas) {
        Log.i(TAG, "Drawing...");

        for(Pixel pixel : pixels) {
            drawRect(canvas, pixel);
        }
    }

    public void tryDrawing(SurfaceHolder holder) {
        Log.i(TAG, "Trying to draw...");

        Canvas canvas = holder.lockCanvas();
        if (canvas == null) {
            Log.e(TAG, "Cannot draw onto the canvas as it's null");
        } else {
            canvas.scale(scale, scale, focusX , focusY);
            canvas.drawColor(Color.WHITE);
            drawMyStuff(canvas);

            holder.unlockCanvasAndPost(canvas);
        }
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        scale *= detector.getScaleFactor();

        // Don't let the object get too small or too large.
        scale = Math.max(1.0f, Math.min(scale, 5.0f));

        tryDrawing();
        return true;

    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        focusX = detector.getFocusX();
        focusY = detector.getFocusY();
        return true;
    }

    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {
    }
}`

Если кто-то не совсем понимает, что я имею в виду, я могу создать видео позже.

Спасибо!

1 Ответ

0 голосов
/ 06 ноября 2018

У меня была такая же проблема, как у вас, в одном из моих проектов.Я пытался мыслить нестандартно, и вместо того, чтобы пытаться задать сводную шкалу для шкалы.
Я использовал стандартную сводную точку (верхний левый угол ..), но я перевел холст на основную, поэтому верхний левый уголбудет на позиции вашего пивота.После этого я перевел свои растровые изображения и вернул их на свое место.Нечто подобное может сделать это:

private void drawMyStuff(final Canvas canvas) {

    Log.i(TAG, "Drawing...");

    for(Pixel pixel : pixels) {
        drawRect(canvas, pixel); // translate your rect with x : -focusX, y: -focusY
    }
}

public void tryDrawing(SurfaceHolder holder) {
    Log.i(TAG, "Trying to draw...");

    Canvas canvas = holder.lockCanvas();
    if (canvas == null) {
        Log.e(TAG, "Cannot draw onto the canvas as it's null");
    } else {
        // Translate the canvas (so the top left corner will be in the wanted position and you can use it as a pivot)
        canvas.translate(focusX , focusY);
        canvas.scale(scale, scale); // Use the default 0,0 pivot
        canvas.drawColor(Color.WHITE);
        drawMyStuff(canvas);

        holder.unlockCanvasAndPost(canvas);
    }
}

Надеюсь, это поможет ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...