Finger координирует дрожание при увеличении изображения - PullRequest
1 голос
/ 21 января 2020

Я использую зум с двумя пальцами.

Второй палец вниз - запомните расстояние между пальцами: (сделано один раз)

event.getPointerCoords(0, finger1_start);
event.getPointerCoords(1, finger2_start);
start_distance = VecLength(finger1_start, finger2_start);

2 пальца down + ACTION_MOVE

event.getPointerCoords(0, finger1_now);
event.getPointerCoords(1, finger2_now);
double distance_now = VecLength(finger1_now, finger2_now);
zoom = distance_now / start_distance;

Метод VecLength - возвращает длину расстояния между двумя точками

double VecLength (MotionEvent.PointerCoords a, MotionEvent.PointerCoords b)
{
    return Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));
}

Проблема, она дрожит при использовании view.setScaleX , Я увеличил как можно более плавно, используя мои пальцы, записывая значение zoom в logcat.

Не используя view.setScaleX / Y Not using setScalex/y

Использование view.setScaleX / Y using setScalex/y

Что доказывает, что я вижу дрожание. Я сузил его до указателей, фактически имеющих разные координаты каждого кадра, идущего назад / вперед.

Я предполагаю, что масштаб каким-то образом влияет на вид, но я не понимаю, как отменить это. Как получить «необработанные» координаты пальцев или учесть масштаб в моих вычислениях?

Не то, чтобы я не мог использовать getRawX , поскольку это возвращает только один палец. Мне явно нужны оба.

1 Ответ

0 голосов
/ 22 января 2020

Кажется, я в основном могу это исправить, умножив начальное расстояние на текущий масштаб:

Так что измените

event.getPointerCoords(0, finger1_now);
event.getPointerCoords(1, finger2_now);
double distance_now = VecLength(finger1_now, finger2_now);
zoom = distance_now / start_distance;

на

event.getPointerCoords(0, finger1_now);
event.getPointerCoords(1, finger2_now);
double distance_now = VecLength(finger1_now, finger2_now);
zoom = distance_now / start_distance * view.getScaleX(); << x and y scale are the same in my case
...