osmdroid API解读(十四)
osmdroid-android org.osmdroid.views.overlay.compass包
1. IOrientationConsumer
方向改变监听器所获取的方向为磁北方向,并非真北方向。
public interface IOrientationConsumer
{
void onOrientationChanged(float orientation, IOrientationProvider source);
}
2. IOrientationProvider
一个方向提供者接口,用于启动方向检测,并回传给IOrientationConsumer接口。
public interface IOrientationProvider
{
boolean startOrientationProvider(IOrientationConsumer orientationConsumer);
void stopOrientationProvider();
float getLastKnownOrientation();
void destroy();
}
3. InternalCompassOrientationProvider
实现了IOrientationProvider接口,将Google API提供的SensorManager进行封装,提供了新的、简单的接口(IOrientationProvider)。
public class InternalCompassOrientationProvider implements SensorEventListener, IOrientationProvider
{
private IOrientationConsumer mOrientationConsumer;
private SensorManager mSensorManager;
private float mAzimuth;
public InternalCompassOrientationProvider(Context context)
{
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
}
//开启方向监听
@Override
public boolean startOrientationProvider(IOrientationConsumer orientationConsumer)
{
mOrientationConsumer = orientationConsumer;
boolean result = false;
final Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
if (sensor != null) {
result = mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);
}
return result;
}
@Override
public void stopOrientationProvider()
{
mOrientationConsumer = null;
mSensorManager.unregisterListener(this);
}
@Override
public float getLastKnownOrientation()
{
return mAzimuth;
}
@Override
public void destroy() {
stopOrientationProvider();
mOrientationConsumer=null;
mSensorManager=null;
}
@Override
public void onAccuracyChanged(final Sensor sensor, final int accuracy)
{
// This is not interesting for us at the moment
}
@Override
public void onSensorChanged(final SensorEvent event)
{
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
if (event.values != null) {
mAzimuth = event.values[0];
if (mOrientationConsumer != null)
mOrientationConsumer.onOrientationChanged(mAzimuth, this);
}
}
}
}
4. CompassOverlay
利用上面封装的罗盘,提供了一个罗盘Overlay。
public class CompassOverlay extends Overlay implements IOverlayMenuProvider, IOrientationConsumer {
...
}
osmdroid-android org.osmdroid.views.overlay.mylocation包
1. IMyLocationConsumer
位置监听器
public interface IMyLocationConsumer {
void onLocationChanged(Location location, IMyLocationProvider source);
}
2. IMyLocationProvider
位置提供者应该有的接口。
public interface IMyLocationProvider {
boolean startLocationProvider(IMyLocationConsumer myLocationConsumer);
void stopLocationProvider();
Location getLastKnownLocation();
void destroy();
}
3. GpsMyLocationProvider
利用Google API实现的gps提供者,使用LocationManager#GPS_PROVIDER、LocationManager#NETWORK_PROVIDER两种模式。
public class GpsMyLocationProvider implements IMyLocationProvider, LocationListener {
private LocationManager mLocationManager;
private Location mLocation;
private IMyLocationConsumer mMyLocationConsumer;
private long mLocationUpdateMinTime = 0;
private float mLocationUpdateMinDistance = 0.0f;
private NetworkLocationIgnorer mIgnorer = new NetworkLocationIgnorer();
private final Set<String> locationSources = new HashSet<>();
public GpsMyLocationProvider(Context context) {
mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
locationSources.add(LocationManager.GPS_PROVIDER);
}
...
}
4. 位置Overlay
osmdroid里面提供了三个不同的提供位置的Overlay:
- SimpleLocationOverlay
- DirectedLocationOverlay
- MyLocationNewOverlay