3

Jellybean 中的“谷歌地图”应用程序有一个指示器,可根据您面对的方式进行调整。我有兴趣实现一个类似的指标,但需要多个指标。

有没有人知道他们如何实现他们的航向指示器(请注意,即使在地图旋转时它也会保持航向)。我尝试使用标记自己的方法,然后我意识到标记不会随地图旋转(经过几个小时的劳动后有点哦……)

总结一下:如何在谷歌地图中实现一个基于标题而不是地图旋转的图标。

所以到目前为止,我看到了两种解决方案:

  • 捕获地图旋转并将其传输到标记
  • 使用 OpenGL 在地图上绘制

在我开始另一个兔子洞之前,有人可以提供任何建议吗?谢谢!

4

3 回答 3

2

如果您想在地图上显示方向,您可以做几件事。

以下是使用的所有导入:

import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;

1.移动地图,使方位在顶部。

private final GoogleMap mMap;

//Get the current position from the map
CameraPosition camPosition = mMap.getCameraPosition();

//Update only the orientation/bearing, get all of the other values from the existing position.
CameraPosition newPos = new CameraPosition(
   camPosition.target,
   camPosition.zoom,        
   camPosition.tilt,
   azimuthInDegress);

//Set the position so that the map will update. The desired heading should not be on top
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(newPos));

这个想法的问题是,如果你不稳定你的方向更新,地图就会到处移动。

2.实现一个LocationSource

谷歌地图让你能够覆盖它的位置提供者。首先,您需要实现一个新的 Location 源:

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.LocationSource;
import com.google.android.gms.maps.MapFragment;


public class LocationSourceImplActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    //Assume using the example from Google
    GoogleMap map = ((MapFragment) getFragmentManager()
            .findFragmentById(R.id.map)).getMap();

    map.setMyLocationEnabled(true);

    LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    map.setLocationSource(new LocationSourceImpl(locManager));
}

    /**
    *The Goal of this class is to listen for both location and heading updates 
    *and combine these into a single update, which will be passed to Google Maps.
    */ 
private class LocationSourceImpl implements LocationSource, LocationListener {

    private OnLocationChangedListener mListener = null;
    private Location mLastLoc = null;
    //Use your desired location provider. You can also update this class to better
    //determine when and how to register
    private static final String PREF_LOC_SRC ="";
    private final LocationManager mLocationManager;
    private float mLastHeading = Float.MAX_VALUE;


    public LocationSourceImpl(LocationManager pLocManager) {
        mLocationManager = pLocManager;

        //Get all updates, modify as desired. 
        mLocationManager.requestLocationUpdates(PREF_LOC_SRC, 0, 0, this);
    }

    @Override
    public void onLocationChanged(Location location) {
        mLastLoc = location;
        notifyListener();
    }

    private void notifyListener() {

        if(mListener != null && mLastLoc!=null) {

            if(mLastHeading != Float.MAX_VALUE) {
                mLastLoc.setBearing(mLastHeading);
            }

            //The listener will be the maps: 
            mListener.onLocationChanged(mLastLoc);

        }

    }

    @Override
    public void activate(OnLocationChangedListener pListener) {
                    //When the setLocationSource is called on the map, the map
                    //will be passed in as an OnLocationChangedListener (may not be the
                    //map, but may be a delegator created by the map. 
        mListener = pListener;
    }

    @Override
    public void deactivate() {
        mListener = null;

    }

    /**
     * This method can/should be replaced with a heading calculation
     * @param pDegrees
     *  Heading in degrees
     */
    public void updateHeadingInDegrees(float pDegrees) {
        mLastHeading = pDegrees;
        notifyListener();

    }

    @Override
    public void onProviderDisabled(String paramString) {

    }

    @Override
    public void onProviderEnabled(String paramString) {

    }

    @Override
    public void onStatusChanged(String paramString, int paramInt,
            Bundle paramBundle) {

    }

}

}

于 2013-11-24T10:03:20.733 回答
0

这是使用指南针根据磁场获得您所面临的方向来完成的。请参阅此处了解不同的传感器

http://developer.android.com/guide/topics/sensors/sensors_overview.html

于 2013-09-17T19:57:58.697 回答
0

http://developer.android.com/reference/android/hardware/SensorManager.html#getOrientation(float[], float[])

用这个。这是使用设备自己的传感器实现的。

而且您也想了解视图,我认为这是一个对您有帮助的示例http://android-er.blogspot.in/2010/08/simple-compass-sensormanager-and.html

于 2013-09-17T20:00:15.113 回答