Почему для реализации «масштабирования просмотров при касании» на Android требуется экспоненциальное увеличение масштабного коэффициента? - PullRequest
0 голосов
/ 03 августа 2020

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

Для получения масштаба по интервалу я попробовал два метода:

(1) Экспоненциальный: https://i.stack.imgur.com/HpppK.jpg

Код (находится внутри метода onTouchEvent (event) представления):

switch (event.getActionMasked()) {
        case MotionEvent.ACTION_POINTER_DOWN:
            prevSpacing = spacing(event);
            break;

        case MotionEvent.ACTION_MOVE:
            if (event.getPointerCount() == 2) {
                float currentSpacing = spacing(event);
                float diff = currentSpacing / prevSpacing;
              
                scaleFactor *= diff;
                scaleFactor = Math.max(Math.min(scaleFactor, 5f), 0.2f);
                setScaleX(scaleFactor);
                setScaleY(scaleFactor);
            }
            break;

(2) Относительный: https://i.stack.imgur.com/Eckel.jpg

КОД: (разница отмечена с помощью >> <<) </p>

   switch (event.getActionMasked()) {
                case MotionEvent.ACTION_POINTER_DOWN:
                    prevSpacing = spacing(event);
                    break;
    
                case MotionEvent.ACTION_MOVE:
                    if (event.getPointerCount() == 2) {
                        float currentSpacing = spacing(event);
                        float diff = currentSpacing / prevSpacing;
// >>
                        prevSpacing = currentSpacing;
// <<
                        scaleFactor *= diff;
                        scaleFactor = Math.max(Math.min(scaleFactor, 5f), 0.2f);
                        setScaleX(scaleFactor);
                        setScaleY(scaleFactor);
                    }
                    break;

Метод интервала следующий:

private float spacing(MotionEvent event) {
        double delta_x = (event.getX(0) - event.getX(1));
        double delta_y = (event.getY(0) - event.getY(1));
        float diff = (float) Math.sqrt(Math.pow(delta_x, 2) + Math.pow(delta_y, 2));
  
        return diff;
    }

По мне, второй метод (относительный) должен работать, а первый не должен, как видно из моих документов. Однако второй метод вызывает дрожание с резким увеличением и уменьшением масштаба при масштабировании, а первый метод работает без сбоев. Почему это так?

Вопросы по теме: (1): Как меняются границы представления и значения getX (), getY () при масштабировании, повороте и переводе представления?

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