如果您想在地图上显示方向,您可以做几件事。
以下是使用的所有导入:
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) {
}
}
}