Android使用RotateAnimation指向特定位置

时间:2017-01-11 20:11:57

标签: android rotation location orientation compass-geolocation

我正在尝试创建一个指向特定坐标的箭头,如指南针。 我正在使用手机中的Sensor.TYPE_ACCELEROMETERSensor.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,每个都位于东北和西北方向,箭头只能正确指向东西方位置。如果位于北方和南方的位置,则箭头旋转180度,这意味着它将完全指向相反方向。如果我向旋转添加180度,箭头将正确指向北部或南​​部的位置,但是东部和西部位置将是错误的。 这真的令人沮丧,这对我来说毫无意义。

如果有人可以帮助我,我真的很感激!提前谢谢!

1 个答案:

答案 0 :(得分:0)

我做了一些进一步的测试,并意识到轴承和方位角的范围是(0 ... 180,-180 ... 0)顺时针方向从0开始,而RotateAnimation从0开始。 ......顺时针360因此,在我进行计算之前,如果它们小于0,我只需加入360就可以转换方位角和方位角。