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