Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android地图自动旋转_Android_Google Maps_Autorotate - Fatal编程技术网

android地图自动旋转

android地图自动旋转,android,google-maps,autorotate,Android,Google Maps,Autorotate,如果你打开谷歌地图应用程序,屏幕右上角有一个按钮,你可以按下该按钮将地图置于当前位置的中心。然后按钮的图标会改变。如果再次按同一按钮,地图将根据您的指南针航向自动旋转。换句话说,地图变得以自我为中心(而不是以他人为中心,即北方总是向上) 谷歌最近推出了适用于Android的MapsAPIv2,我当然更喜欢它。默认情况下,android maps V2将包含“位置中心”按钮。但是,多次按下该按钮无法启用自动旋转;它只是试图再次将地图置于您所在位置的中心 有人知道我如何像谷歌地图应用程序一样使用地图

如果你打开谷歌地图应用程序,屏幕右上角有一个按钮,你可以按下该按钮将地图置于当前位置的中心。然后按钮的图标会改变。如果再次按同一按钮,地图将根据您的指南针航向自动旋转。换句话说,地图变得以自我为中心(而不是以他人为中心,即北方总是向上)

谷歌最近推出了适用于Android的MapsAPIv2,我当然更喜欢它。默认情况下,android maps V2将包含“位置中心”按钮。但是,多次按下该按钮无法启用自动旋转;它只是试图再次将地图置于您所在位置的中心


有人知道我如何像谷歌地图应用程序一样使用地图API v2自动旋转地图吗?我必须自己实现这个功能吗?还是在API中,我只是没有看到它?非常感谢您的帮助。

对不起,您必须使用和自己来实现它


如果MAPAPIv2可以使用这些函数,那么它们肯定会出现在或上。好的,我认为一年后应该这样做。如果你发现任何问题,请纠正我

以下大多数代码处理坐标系之间的差异。我用的是旋转矢量传感器。从文档中可以看出:
Y与设备当前位置的地面相切,并指向磁北。
另一方面,谷歌地图中的方位似乎指向正北

1) 从当前GPS位置获取当前磁偏角

@Override
public void onLocationChanged(Location location) {
    GeomagneticField field = new GeomagneticField(
            (float)location.getLatitude(),
            (float)location.getLongitude(),
            (float)location.getAltitude(),
            System.currentTimeMillis()
        );

    // getDeclination returns degrees
    mDeclination = field.getDeclination();
} 
2) 根据磁偏角和磁北计算轴承

    @Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
        SensorManager.getRotationMatrixFromVector(
                mRotationMatrix , event.values);
        float[] orientation = new float[3];
        SensorManager.getOrientation(mRotationMatrix, orientation);
        float bearing = Math.toDegrees(orientation[0]) + mDeclination;
        updateCamera(bearing);  
    }
}
3) 更新地图

private void updateCamera(float bearing) {
    CameraPosition oldPos = mMap.getCameraPosition();

    CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing).build();
            mMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos));
}

这可以通过向传感器侦听器注册应用程序来确定方向,并在传感器更改和相应更新相机时获得相对于正北的角度。 角度可用于轴承。可以使用以下代码:

Instead of using Sensor.TYPE_ORIENTATION try using getOrinetation api. Sensor.TYPE_ORIENTATION
has been deprecated.

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if (sensorManager != null)
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                SensorManager.SENSOR_DELAY_GAME);
}

public void onSensorChanged(SensorEvent event) {

    float degree = Math.round(event.values[0]);

    Log.d(TAG, "Degree ---------- " + degree);

    updateCamera(degree);

}

private void updateCamera(float bearing) {
    CameraPosition oldPos = googleMap.getCameraPosition();

    CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing)
            .build();

    googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos));

}

我已经成功地实现了aleph_null解决方案,在此我将添加一些在已接受的解决方案中未提及的细节:

要使上述解决方案正常工作,您需要实现android.hardware.SensorEventListener接口

您还需要在onResume和onPause方法中注册到SensorEventListener,如下所示:

@Override
    protected void onResume() {
     super.onResume();
     mSensorManager.registerListener(this,
             mRotVectSensor,
             SensorManager.SENSOR_STATUS_ACCURACY_LOW);
    }

@Override
protected void onPause() {
    // unregister listener
    super.onPause();
    mSensorManager.unregisterListener(this);
}
“@字节码”注意:为避免闪烁,在采样周期中使用低值,如SensorManager.SENSOR\u STATUS\u Accurance\u low

我还注意到,传感器发送的数据有时超过了设备的处理能力,因此,地图相机开始以一种奇怪的方式移动

要控制onSensorChanged处理的数据量,我建议以下实现:

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
        SensorManager.getRotationMatrixFromVector(
                mRotationMatrix, event.values);
        float[] orientation = new float[3];
        SensorManager.getOrientation(mRotationMatrix, orientation);
        if (Math.abs(Math.toDegrees(orientation[0]) - angle) > 0.8) {
            float bearing = (float) Math.toDegrees(orientation[0]) + mDeclination;
            updateCamera(bearing);
        }
        angle = Math.toDegrees(orientation[0]);
    }
}

新的Location类已经自动为您提供了轴承,为什么不使用它呢

示例代码:

private void updateCameraBearing(GoogleMap googleMap, Location myLoc) {
    if ( googleMap == null) return;
    CameraPosition camPos = CameraPosition
            .builder(googleMap.getCameraPosition())
            .bearing(myLoc.getBearing())
             // if you want to stay centered - then add the line below
            .target(new LatLng(myLoc.getLatitude(), myLoc.getLongitude()))
            .build();
    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(camPos));
}

这很有帮助。。。我甚至不知道这个功能,谢谢。对我来说,它工作得很好(v7)他,我也想做同样的事情,如果你已经做了,请分享你的解决方案。
private float[]mRotationMatrix=new float[16]
getRotationMatrixFromVector
将根据事件中的值填充
mRotationMatrixFromVector
。这会在地图上产生闪烁效果,如何限制旋转应注意getRotationMatrixFromVector()将此限制为API 9+。应该与那些支持传统应用程序的应用程序相关。您好,我实现了上述代码,我在应用程序中获得了旋转功能,但Google Map正在不断向上移动。mdecliation?
mRotVectSensor
?其中是角度定义的rotvectsensor=mSensorManager.getDefaultSensor(Sensor.TYPE_rotation_VECTOR);