У меня есть ImageView, который вы можете использовать для панорамирования одним пальцем или масштабирования двумя пальцами.Работает нормально.Я расширил его, чтобы обрабатывать вращение, и его поведение вызывает некоторую путаницу.
При возникновении события с несколькими касаниями вызывается этот метод, который должен возвращать угол поворота в градусах.Это не делает то, что я ожидаю.
private int fingersAngle(MotionEvent event)
{
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
int degrees = (int)(Math.toDegrees(Math.atan2(y, x)));
return degrees;
}
Когда я поверну два пальца, я ожидаю вывод, как ...
158 166 168 169 174 176 179 181 и т. Д.
Но то, что я на самом деле получаю, больше похоже на это:
158 166 -179 179 -179 179 -179
Кажется, проблема в знаках.Как этот метод узнает, является ли он 180 или -180, или 90 или -270?Изображение часто вращается в неправильном направлении, а затем внезапно прыгает и начинает вращаться в противоположном направлении.Еще хуже то, что направление, в котором он первоначально вращается, является практически случайным.
Я тестирую приложение с помощью Nexus One, но также вижу ту же проблему на планшете Advent Vega.Оба устройства работают нормально с Google Maps в 3D, чтобы повернуть экран (если иногда немного нервно), поэтому доказательства не предполагают аппаратных ограничений.
Вторая проблема заключается в том, что когда два пальца находятся приблизительно вертикально илиВыровненный по горизонтали угол просто не меняется, поэтому вращение «залипает» примерно на 10-20 градусов сверху / снизу / влево / вправо.
В настоящее время я проверяю, не изменился ли угол внезапноизменил огромное количество, и если это так, вычтите его из 360. Уродливо, черт возьми, но это немного помогает.
Надеюсь, один из вас видел это раньше и знает, как извлечь угловое вращение из мульти-сенсорный жест.
Некоторые вещи в Android настолько просты, что это удивительно, но такие вещи очень болезненны.