com.mapbar.android.maps
Class MyLocationOverlay

java.lang.Object
  extended by com.mapbar.android.maps.Overlay
      extended by com.mapbar.android.maps.MyLocationOverlay
All Implemented Interfaces:
android.hardware.SensorListener, android.location.LocationListener, Overlay.Snappable

public class MyLocationOverlay
extends Overlay
implements android.hardware.SensorListener, android.location.LocationListener, Overlay.Snappable

Overlay是一个覆盖,它绘制用户当前在地图上的位置(精准度),和/或一个嵌入的指南针。子类能覆盖方法dispatchTap(),去处理对当前位置的点击。

为了开启这个overlay的功能,需要去调用enableMyLocation()和/或enableCompass(), 或调用Activity中的Activity.onResume()方法。记住,当在后台是,要在Activity中的Activity.onPause()方法中调用相应的 disableMyLocation() 和/或disableCompass()关闭这个功能。

或者,构造函数也能携带一个MapController,当在屏幕外时,它可以通过平移地图来保持"我的位置"这个点的可见性,同时也携带一个View,当位置和朝向改变时,调用View.postInvalidate()去使其无效

Runnables 由 runOnFirstFix(java.lang.Runnable)提供,一旦我们有了一个位置,它将被运行。(例如,定位地图中心和用缩放来显示位置)。


Nested Class Summary
 
Nested classes/interfaces inherited from class com.mapbar.android.maps.Overlay
Overlay.Snappable
 
Field Summary
 
Fields inherited from class com.mapbar.android.maps.Overlay
SHADOW_X_SKEW, SHADOW_Y_SCALE
 
Constructor Summary
MyLocationOverlay(android.content.Context context, MapView mapView)
           构造一个新的MyLocationOverlay。
 
Method Summary
 void disableCompass()
           禁止指南针传感器的更新。
 void disableMyLocation()
           停止位置更新。
protected  boolean dispatchTap()
           处理在“我的位置”点上的点击。
 boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)
           绘制方法。
protected  void drawCompass(android.graphics.Canvas canvas, float bearing)
           绘制指南针小图标。
protected  void drawMyLocation(android.graphics.Canvas canvas, MapView mapView, android.location.Location lastFix, GeoPoint myLocation, long when)
           绘制“我的位置”点。
 boolean enableCompass()
           启用指南针传感器的更新。
 boolean enableMyLocation()
           尝试去启用MyLocation,向LocationManager.GPS_PROVIDER and LocationManager.NETWORK_PROVIDER注册更新。
 android.location.Location getLastFix()
           返回一个相对于最新设置的用户位置。
 GeoPoint getMyLocation()
           返回一个对应于最新设置的用户位置的GeoPoint
 float getOrientation()
           返回最近一个指南针的朝向。
 boolean isCompassEnabled()
           检查指南针小部件是否被显示
 boolean isMyLocationEnabled()
           检查位置感知功能是否被打开(通过GPS或网络)
 void onAccuracyChanged(int sensor, int accuracy)
           
 void onLocationChanged(android.location.Location location)
           监听并从LocationManagerService获取位置更新。
 void onProviderDisabled(java.lang.String provider)
          
 void onProviderEnabled(java.lang.String provider)
          
 void onSensorChanged(int sensor, float[] values)
           当指南针刻度发生变化时,由SensorManager调用。
 boolean onSnapToItem(int x, int y, android.graphics.Point snapPoint, MapView mapView)
           检查给定的(x,y)是否非常接近于一个导致当前点击动作的item。
 void onStatusChanged(java.lang.String provider, int status, android.os.Bundle extras)
          
 boolean onTap(GeoPoint p, MapView map)
           检查点击的位置是否和当前的位置(如果已知的话)是否非常接近。
 boolean runOnFirstFix(java.lang.Runnable runnable)
           把runnable加入到队列里,一旦收到第一个位置,就执行这个runnable。
 
Methods inherited from class com.mapbar.android.maps.Overlay
draw, drawAt, onKeyDown, onKeyUp, onTouchEvent, onTrackballEvent
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

MyLocationOverlay

public MyLocationOverlay(android.content.Context context,
                         MapView mapView)
构造一个新的MyLocationOverlay。

Parameters:
context - 一个用于访问系统服务的上下文(context)。
mapView - 将要叠加位置上去的MapView。
Throws:
如果mapView为null,则抛出java.lang.IllegalArgumentException异常。
Method Detail

enableCompass

public boolean enableCompass()
开启指南针更新功能。如果已经开启,则无须改变。对于没有指南针功能的手机,不支持Compass的相关方法。

Returns:
如果开启请求成功,返回true;如果指南针不能被开启,返回false。

disableCompass

public void disableCompass()
关闭指南针的更新。


isCompassEnabled

public boolean isCompassEnabled()
检查指南针小部件是否被显示。

Returns:
如果指南针已被显示返回true,否则返回false。

enableMyLocation

public boolean enableMyLocation()
尝试开启MyLocation功能,并向LocationManager.GPS_PROVIDER 和 LocationManager.NETWORK_PROVIDER注册更新。

Returns:
如果发现至少一个位置提供者,返回true。如果我们尝试的每一个都无法得到,返回false。

disableMyLocation

public void disableMyLocation()
当指南针的值变换时,由SensorManager调用。

在android.hardware.SensorListener接口的onSensorChanged中有详细说明。


onSensorChanged

public void onSensorChanged(int sensor,
                            float[] values)
从LocationManagerServices监听并获取位置更新。

Specified by:
在android.hardware.SensorListener接口的onSensorChanged中有详细说明。

onLocationChanged

public void onLocationChanged(android.location.Location location)
从LocationManagerServices监听并获取位置更新。

Specified by:
在接口android.location.LocationListener的onLocationChanged中有详细说明。

onStatusChanged

public void onStatusChanged(java.lang.String provider,
                            int status,
                            android.os.Bundle extras)

Specified by:
在接口android.location.LocationListener的onStatusChanged中有详细说明。

onProviderEnabled

public void onProviderEnabled(java.lang.String provider)

Specified by:
在接口android.location.LocationListener的onProviderEnabled中有详细说明。

onProviderDisabled

public void onProviderDisabled(java.lang.String provider)

Specified by:
在接口android.location.LocationListener的onProviderDisabled中有详细说明。

onSnapToItem

public boolean onSnapToItem(int x,
                            int y,
                            android.graphics.Point snapPoint,
                            MapView mapView)
从接口Overlay.Snappable中拷贝的描述:
检查给定的(x,y)是否和一个item非常接近,导致当前的行为(例如缩放)和item对齐。

Specified by:
在接口onSnapToItemOverlay.Snappable中有详细说明。
Parameters:
x - 屏幕坐标x
y - 屏幕坐标y
snapPoint - 在屏幕坐标上,距最接近给定的(x,y)处填充兴趣点。如果没有对齐则不能被触摸。
mapView - 请求对齐的MapView. 使用MapView.getProjection()在屏幕像素和经纬度对之间做变换。
Returns:
Whether or not to snap to the interesting point.

onTap

public boolean onTap(GeoPoint p,
                     MapView map)
检查点击的位置是否非常接近于当前的位置(如果已知)。如果为真,传递给dispatchTap(); 否则返回false。处理一个点击事件。这可能是个地图任何地方的触屏,或是在地图中心的跟踪球点击。默认情况下不做任何动作,返回false。

Overrides:
onTap 中的 Overlay
Parameters:
p - 点击的位置点。
map - 产生tap事件的MapView.
Returns:
如果点击被这个overlay处理,返回true。

dispatchTap

protected boolean dispatchTap()
在“我的位置”坐标上处理点击事件。默认行为是什么都不做,返回false。

Returns:
如果这个点击被处理,返回true;如果这个点击事件应该被传递到其它overlay,返回false。

draw

public boolean draw(android.graphics.Canvas canvas,
                    MapView mapView,
                    boolean shadow,
                    long when)
绘制方法。在阴影穿透模式下什么都不做。在非阴影穿透模式下,如果得到一个位置信息,调用drawMyLocation(android.graphics.Canvas, com.mapbar.android.maps.MapView, android.location.Location, com.mapbar.android.maps.GeoPoint, long),然后如果能够阅读指南针则调用drawCompass(android.graphics.Canvas, float) 因为我们不要求立即重绘所以返回false;但是,为了能触发下一阶段蓝色位置点的动画,viewToInvalidate会发出延迟的无效通知,并传递给这个类的构造器。

Overrides:
draw 中的 Overlay
Parameters:
canvas - 待绘制的画布。注意它或许已经实施了变换,所以保持取到它时的原样。
mapView - 请求绘制的MapView。使用 MapView.getProjection()在屏幕像素和经纬度对之间做变换。
shadow - 如果为true,绘制阴影层。如果为false,绘制overlay的内容。
when - 绘制时的时间戳。
Returns:
如果需要立即绘制,返回true。否则返回false。默认的实现返回false。

drawMyLocation

protected void drawMyLocation(android.graphics.Canvas canvas,
                              MapView mapView,
                              android.location.Location lastFix,
                              GeoPoint myLocation,
                              long when)
绘制“我的位置”点。默认情况下,绘制一个动画的“蓝色点”,可能由一个蓝色圆盘所围绕来标识精度。而且, 如果用户的位置移动到屏幕的边缘,我们已经在构造函数力提供了一个 MapController , 将使用滚动来重新确定地图的中心。

Parameters:
canvas - 待绘制的画布。
mapView - 调用绘制方法的mapView。
lastFix - 最后一个收到的位置信息。
myLocation - 最后一个位置的坐标,萃取成为一个方便的GeoPoint
when - 绘制的时间,毫秒。

drawCompass

protected void drawCompass(android.graphics.Canvas canvas,
                           float bearing)
绘制指南针。默认情况下,在左上角绘制指南针的底盘和箭头。

Parameters:
canvas - 待绘制的画布。
bearing - 估算出来的手机的朝向,东方方向。

getMyLocation

public GeoPoint getMyLocation()
返回一个GeoPoint,对应于一个最近设定的用户位置。

Returns:
一个GeoPoint,或null如果没有设定任何东西。

getLastFix

public android.location.Location getLastFix()
返回一个位置,对应于最近设定的用户位置。

Returns:
位置,如果设定为null则返回null。

getOrientation

public float getOrientation()
返回最近设定的的指南针朝向。

Returns:
朝向,东方方向的度数,如果没有设置,则返回NaN。

isMyLocationEnabled

public boolean isMyLocationEnabled()
检查位置功能是否能够被打开(通过GPS或网络)。

Returns:
如果位置功能被启用返回true,否则返回false。

runOnFirstFix

public boolean runOnFirstFix(java.lang.Runnable runnable)
把一个runnable加入队列,一旦收到一个位置信息,这个runnable就被执行。如果已经有了一个位置,则立即执行runnable,且返回true。如果没有,将挂起这个runnable,且返回false。 一旦得到一个新的位置信息,将在一个新的线程中运行这个runnable。


onAccuracyChanged

public void onAccuracyChanged(int sensor,
                              int accuracy)
Specified by:
接口android.hardware.SensorListener中的onAccuracyChanged有详细说明。