Я использую зум с двумя пальцами.
Второй палец вниз - запомните расстояние между пальцами: (сделано один раз)
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
Использование view.setScaleX / Y
Что доказывает, что я вижу дрожание. Я сузил его до указателей, фактически имеющих разные координаты каждого кадра, идущего назад / вперед.
Я предполагаю, что масштаб каким-то образом влияет на вид, но я не понимаю, как отменить это. Как получить «необработанные» координаты пальцев или учесть масштаб в моих вычислениях?
Не то, чтобы я не мог использовать getRawX , поскольку это возвращает только один палец. Мне явно нужны оба.