анимация вращения компаса android

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

Проблема в том, что кажется, что анимация вращения вращает стрелку не в соответствии с реальными координатами, а относительно экрана телефона. Таким образом, поворот стрелки на 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 — это последнее положение, в котором находилась стрелка, я использую его, потому что без него стрелка возвращается к нулю градусов и мерцает.

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


person mgalal    schedule 05.07.2012    source источник


Ответы (1)


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

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

Ответ прост:

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

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

person mgalal    schedule 05.07.2012
comment
Хммм, почему вы используете fromDegree, toDegree с одинаковым значением? Направляет ли он к месту? - person Khiem-Kim Ho Xuan; 22.01.2015