Android 使用指向特定位置的 RotateAnimation
Android using RotateAnimation pointing towards a specific location
我正在尝试创建一个指向特定坐标的箭头,例如指南针。
我正在使用 phone 中的 Sensor.TYPE_ACCELEROMETER
和 Sensor.TYPE_MAGNETIC_FIELD
来计算方位角(我参考了这个问题 Using orientation sensor to point towards a specific location ):
//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);
然而,我测试了四个不同的 targetLocations,每个 targetLocations 分别在东北和西方向,箭头只正确指向东西方位置。对于南北方向的位置,箭头旋转 180 度,这意味着它将完全指向相反的方向。如果我旋转 180 度,箭头将正确指向北方或南方的位置,但东方和西方的位置将是错误的。
这真的很令人沮丧,这对我来说完全没有意义。
如果有人能帮助我,我将非常感激!提前致谢!
我做了一些进一步的测试,发现方位角和方位角的范围都是 (0...180,-180...0) 顺时针方向从 0 开始,而 RotateAnimation 需要角度从 0...360 顺时针方向。因此,在我继续计算之前,如果方位角和方位角小于 0,我只是通过加上 360 来转换方位角和方位角。
我正在尝试创建一个指向特定坐标的箭头,例如指南针。
我正在使用 phone 中的 Sensor.TYPE_ACCELEROMETER
和 Sensor.TYPE_MAGNETIC_FIELD
来计算方位角(我参考了这个问题 Using orientation sensor to point towards a specific location ):
//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);
然而,我测试了四个不同的 targetLocations,每个 targetLocations 分别在东北和西方向,箭头只正确指向东西方位置。对于南北方向的位置,箭头旋转 180 度,这意味着它将完全指向相反的方向。如果我旋转 180 度,箭头将正确指向北方或南方的位置,但东方和西方的位置将是错误的。 这真的很令人沮丧,这对我来说完全没有意义。
如果有人能帮助我,我将非常感激!提前致谢!
我做了一些进一步的测试,发现方位角和方位角的范围都是 (0...180,-180...0) 顺时针方向从 0 开始,而 RotateAnimation 需要角度从 0...360 顺时针方向。因此,在我继续计算之前,如果方位角和方位角小于 0,我只是通过加上 360 来转换方位角和方位角。