如何在android中顺利旋转地图视图

时间:2012-09-12 07:11:49

标签: android google-maps geolocation

我正在尝试在用户改变方向时旋转地图视图,即如果用户左转和右转,它应该相应地旋转。我正在基于当前位置旋转地图视图,它正在正确旋转但是它是抖动的。这是我用来轮换的代码

   public void onGPSUpdate(Location location) 
{
     boolean check=isBetterLocation(location, tempLoc);
    tempLoc=location;

     if(check){
        showLocation(location);

     }

}
isBetterLocation method is copied from google docs for better location.

private void showLocation(Location loc){
   mRotateView.rotate(-loc.getBearing());             
   }

我注册了一个位置更新,时间间隔为0,最小距离为10,经常更新。这里我的问题是地图视图总是抖动,任何人都可以告诉我如何像其他应用程序一样平滑地旋转地图视图,如waze maps do .Thanks ...

4 个答案:

答案 0 :(得分:4)

您是否尝试以平滑的方式旋转地图,例如一次旋转一度,或者只是在位置更新时从A级转到B级?

这样的东西
while (oldAngle != newAngle)
{
mapView.rotate(newAngle);
// this is where you would decied to add or subtract; 
newAngle ++ or -- ; 
}

不确定这是否会完全正常,因为循环会很快运行,所以可以将其作为asynctask并在其中添加暂停以模拟平滑旋转。

Double angle = Math.atan2((userstartPoint.getX() - userendPoint.getX()), userstartPoint.getY() - userendPoint.getY());
            angle = Math.toDegrees(angle);
            map.setRotationAngle(angle);

所以基本上我得到了起点(新位置),然后是终点(旧位置)并在其上做了一个Math.atan2,如你所见。然后将其转换为度数并将其设置为我的地图旋转。 现在它没有顺利旋转,但我不需要它。您可以在此处设置自己的步进器以实现平滑旋转。除非谷歌地图已经有一个。

答案 1 :(得分:2)

由于位置的轴承值不是很精确并且倾向于略微跳跃,因此应使用过滤器作为轴承。例如,将最后5个轴承值保留在数组中,并使用这些值的平均值作为将地图旋转到的方位。或者使用SensorEvent docs中说明的过滤器 - 它更易于使用,可以更好地调整。

这样可以平滑地图的旋转速度。保持稳定。

修改

低通滤波器的一个版本:

public static float exponentialSmoothing(float input, float output, float alpha) {
    output = output + alpha * (input - output);
    return output;
}

像这样使用它:

final static float ALPHA = 0.33; // values between 0 and 1
float bearing;

// on location/bearing changed:

bearing = exponentialSmoothing(bearing, newBearing, ALPHA);

bearing将是用于实际旋转地图的值,newBearing将是您从每个事件中获得的结果,而使用ALPHA,您可以控制的速度或速度通过对结果中考虑了多少旧轴承和新轴承的加权,旋转作用到新的方向。较小的值会使旧值更高,较高的值会使新值更高。

我希望能更好地解决问题。

答案 2 :(得分:1)

要更改地图的方位,请使用Camera课程。您可以使用新方位定义新CameraPosition,如果想要平滑移动,请告诉相机使用GoogleMap.moveCameraGoogleMap.animateCamera移动。

答案 3 :(得分:0)

我已在我的应用中实现了此功能。我基本上做的是我拿走了路径的最后一个和第二个LatLng并使用

计算方位
func loadData() {

    var queryFollowers:PFQuery = PFQuery(className: "Followers")
        queryFollowers.whereKey("follower", equalTo: PFUser.currentUser()!)
    var postQuery:PFQuery = PFQuery(className: "Posts")
        postQuery.whereKey("postedBy", matchesQuery: queryFollowers)

    var postQueryCurrentUser:PFQuery = PFQuery(className: "Posts")
        postQueryCurrentUser.whereKey("postedBy", equalTo: PFUser.currentUser()!)
    var compoundQuery = PFQuery.orQueryWithSubqueries([postQuery, postQueryCurrentUser])
        compoundQuery.findObjectsInBackgroundWithBlock { (objects, error) -> Void in

            if let objects = objects {

                for object in objects {

                    self.data.addObject(object)
                    println(self.data)

                }

            }

    }
}

将此角度设置为相机位置的方位角。

注意:有时(很少)它将地图旋转到相反的方向。我正在寻找它,但如果有人有理由做回复。