Перемещение вида с помощью ACTION_MOVE в масштабном макете - PullRequest
0 голосов
/ 25 августа 2018

Hello!Спасибо за чтение.

Основываясь на ответе этого , я интегрировал перетаскивание вида следующим образом:

float dX, dY;

@Override
public boolean onTouch(View view, MotionEvent event) {

    switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:

            dX = view.getX() - event.getRawX();
            dY = view.getY() - event.getRawY();
            break;

        case MotionEvent.ACTION_MOVE:

            setX(event.getRawX() + dX);
            setY(event.getRawY() + dY);
            break;

        default:
            return false;
    }  return true;
}

ОднакоПоложение вида относительно моего пальца пропорционально смещено с масштабом родительского макета.Другими словами, когда я начинаю масштабировать макет, перетаскивание View перерывается.

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

Я даже не могу достичь точки, в которой расстояние между моим пальцем и видом является постоянным.

Следует отметить, что проблема наблюдается только в том случае, если масштаб родителя не равен 1.

.

Большое спасибомного за вашу помощь!

1 Ответ

0 голосов
/ 31 августа 2018

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

float dX, dY;

@Override
public boolean onTouch(View view, MotionEvent event) {

    switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:

            dX = view.getX() - event.getRawX() / dScale;
            dY = view.getY() - event.getRawY() / dScale;
            break;

        case MotionEvent.ACTION_MOVE:

            setX(event.getRawX() / dScale + dX);
            setY(event.getRawY() / dScale + dY);
            break;

        default:
            return false;
    }  return true;
}

Я бы также рекомендовал сначала установить переключатель MOVE на коммутаторе.

Полагаю, что причины этого решения можно смутно объяснить "методами позиционирования вида знают, как справляться с масштабированием, а методы сенсорного обратного вызова - нет".

Надеюсь, это поможет некоторым!

...