Я пытаюсь создать стрелку, указывающую на конкретную координату, как компас. Я использую Sensor.TYPE_ACCELEROMETER
и Sensor.TYPE_MAGNETIC_FIELD
от телефона, чтобы вычислить угол азимута (я взял ссылку из этого вопроса Using orientation sensor to point towards a specific location):Android, использующий RotateAnimation, указывающий на конкретное местоположение
//calculate RotationMatrix
if (gravity != null && geomag != null) {
boolean success = SensorManager.getRotationMatrix(inR, I,
gravity, geomag);
if (success) {
SensorManager.getOrientation(inR, orientVals);
azimuth = Math.toDegrees(orientVals[0]);
pitch = Math.toDegrees(orientVals[1]);
roll = Math.toDegrees(orientVals[2]);
}
}
azimuth += geomagneticField.getDeclination();
//azimuth = Math.round(sensorEvent.values[0]);
float bearing = lastLocation.bearingTo(targetLocation);
float angle = (float) azimuth + bearing;
я затем использовать RotatateAnimation для создания вращения самой стрелки:
//the +90 below is because the ImageView arrow is pointing towards left by default
RotateAnimation animation = new RotateAnimation(
-(angle+90),
-(angle+90),
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF,
0.5f);
Тем не менее, я проверил четыре разных целевых местоположения каждый в направлениях северо-восток на юг и на запад, стрелка только правильно указала в направлении восточного запада. В случае местоположений в направлении север и юг стрелка поворачивается на 180 градусов, а это означает, что она будет направлена в противоположном направлении. Если я добавлю 180 градусов к вращению, стрелка будет правильно указывать на места на севере или на юге, но тогда места с востока и запада будут неправильными. Это действительно расстраивает, и для меня это совершенно не имеет смысла.
Я был бы действительно благодарен, если бы кто-нибудь мог мне помочь! Заранее спасибо!