Android Компас Rotateanimation

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

Проблема в том, что кажется, что rotateanimation не вращает стрелку в соответствии с координатами реального мира, а вместо этого относительно экрана телефона. Таким образом, вращение стрелки на 58 градусов не соответствует повороту на 58 градусов в реальном мире. Это правда или я ошибаюсь в своем коде?

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

Azimuth           Actual Phone angle
0                        0
45                       90
90                       180

когда он приближается к полному кругу назад, он отскакивает от 120 до 340.

Вот код:

direction = 360 - azimuth + rotate;

RotateAnimation animate = new RotateAnimation(rotateLast, direction, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            animate.setFillAfter(true);
            animate.setInterpolator(new LinearInterpolator());
            animate.setDuration(10);
            needle.startAnimation(animate);

            rotateLast = direction;

азимут - это азимут телефона от датчика, поворот - это заданное пользователем направление (в градусах от севера), а направление - требуемое вращение стрелки.

rotateLast - последняя позиция, в которой находилась игла, я использую ее, потому что без нее стрелка возвращается в ноль градусов и мерцает.

Спасибо, PS это сводит меня с ума

1 ответ

Решение

Я понял, моя математика была неправильной, и я неправильно понял, как азимут повлиял на вращение.

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

Ответ прост:

RotateAnimation animate = new RotateAnimation(-azimuth+rotation, -azimuth+rotation, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

азимут из-за того, что вращательная анимация вращается против часовой стрелки.

Другие вопросы по тегам