android百度地圖改變MyLocationOverlay默認圖標(兩種方法)

開放地圖API無外乎google ,百度,高德等.其它的還有很多,不過比較好用的就這三種瞭,如果不需要出國(臺灣例外),則最好使用百度地圖,性能比高德好的多,無聊的時候自己可以測試測試.
     下面我簡單介紹下百度地圖的應用.首先地圖所需要的key就不多說瞭.
      在這裡我要說明一點:大傢在加入jar包的時候一定要加入到libs文件夾中,(不可以是lib),不然運行會出現下面這個錯誤,我也為此糾結過.希望對你們有幫助,在此write it for you.

      
大傢可以參考官方文檔和給出的DEMO進行學習,有問題大傢一起研究.
在這裡我重點說明一下如何改變百度地圖在定位自己時的默認藍色圓圈.
Overlay:覆蓋物的抽象基類,所有的覆蓋物均繼承此類的方法,實現用戶自定義圖層顯示。
MyLocationOverlay:一個負責顯示用戶當前位置的Overlay。
第一種方法很簡單,我們隻需要創建一個繼承MyLocationOverlay的類重寫其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 – 繪制的時間,毫秒。

[java
@Override 
    protected void drawMyLocation(Canvas canvas, MapView mapView, 
            Location lastFix, GeoPoint myLocation, long when) { 
        try { 
            Projection projection = mapView.getProjection(); 
            Point point = new Point(); 
            projection.toPixels(myLocation, point); 
 
            int x = point.x – bitmap.getWidth() / 2; 
            int y = point.y – bitmap.getHeight(); 
            canvas.drawBitmap(bitmap, x, y, new Paint()); 
 
        } catch (Exception e) { 
            super.drawMyLocation(canvas, mapView, lastFix, myLocation, when); 
        } 
    } 
這裡簡單說明一下:point獲取到的是我們在屏幕上的點.而我們要顯示的圖標應該在這個點的正上方,因此x,y的計算大傢都不難理解瞭.
接下來的操作和原來的一樣,隻需要調用即可.
[java] 
/***
     * 初始化map
     */ 
    void InitMap() { 
        bMapManager = new BMapManager(this); 
        bMapManager.init(Key, this); 
        super.initMapActivity(bMapManager); 
 
        mMapView = (MapView) findViewById(R.id.bmapsView); 
        mMapView.setBuiltInZoomControls(true); // 設置啟用內置的縮放控件 
        mMapView.setDrawOverlayWhenZooming(true);// 縮放圖標仍然show 
 
        mMapController = mMapView.getController(); 
         
        mMapController.setZoom(16); // 設置地圖zoom級別 
    } 

[java] 
/***
     * 添加自己的overlay
     */ 
    void addMyOverLay() { 
        locationOverlay = new LocationOverLay(MainActivity.this, mMapView); 
        overlays = mMapView.getOverlays(); 
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 
                R.drawable.location); 
        locationOverlay.setBitmap(bitmap); 
        overlays.add(locationOverlay); 
    } 

[java] 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        setTitle("jjhappyforever…"); 
        InitMap(); 
        addMyOverLay(); 
 
    } 
 
    @Override 
    protected void onDestroy() { 
        if (bMapManager != null) { 
            bMapManager.destroy(); 
            bMapManager = null; 
        } 
        super.onDestroy(); 
    } 
 
    @Override 
    protected void onPause() { 
        if (bMapManager != null) { 
            bMapManager.getLocationManager().removeUpdates(this); 
            locationOverlay.disableMyLocation(); 
            locationOverlay.disableCompass(); // 打開指南針 
            bMapManager.stop(); 
        } 
        super.onPause(); 
    } 
 
    @Override 
    protected void onResume() { 
        if (bMapManager != null) { 
            bMapManager.getLocationManager().requestLocationUpdates(this); 
            locationOverlay.enableMyLocation(); 
            locationOverlay.enableCompass(); // 打開指南針 
            bMapManager.start(); 
        } 
 
        super.onResume(); 
    } 
[java] 
/***
     * Location 監聽
     * 
     * @param arg0
     */ 
    @Override 
    public void onLocationChanged(Location location) { 
        // 獲取自己的經緯度點 
        GeoPoint geoPoint = new GeoPoint((int) (location.getLatitude() * 1e6), 
                (int) (location.getLongitude() * 1e6)); 
        mMapController.setCenter(geoPoint); 
         
    } 
定位居中顯示.
示例顯示:


第二種方案:
我們bMapManager.getLocationManager().requestLocationUpdates(this);獲取自身的GeoPoint.那麼我們可以根據該GeoPoint創建一個Overlay.其實MyLocationOverlay是Overlay的一個子類,這樣我們就不難理解瞭。發話不多說瞭,
在這裡我們根據自身的GeoPoint添加一個Overlay
[java]
/***
     * Location 監聽
     * 
     * @param arg0
     */ 
    @Override 
    public void onLocationChanged(Location location) { 
        // 獲取自己的經緯度點 
        GeoPoint geoPoint = new GeoPoint((int) (location.getLatitude() * 1e6), 
                (int) (location.getLongitude() * 1e6)); 
        mMapController.setCenter(geoPoint); 
         addOverLay(geoPoint); 
    } 

[java]
/***
     * 添加overlay
     */ 
    void addOverLay(GeoPoint geoPoint) { 
        overlays = mMapView.getOverlays(); 
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), 
                R.drawable.location); 
        overlay = new MyOverlay(mMapView, bitmap); 
        overlay.setGeoPoint(geoPoint); 
        overlays.add(overlay);//添加自定義overlay 
    } 

[java]
public class MyOverlay extends Overlay { 
    private MapView mapView; 
    private Projection projection; 
    private Point point;// 屏幕對象的點 
    private Bitmap bitmap; 
 
    private GeoPoint geoPoint;// 經緯度點 
 
    public void setGeoPoint(GeoPoint geoPoint) { 
        this.geoPoint = geoPoint; 
    } 
 
    public MyOverlay(MapView mapView, Bitmap bitmap) { 
        super(); 
        this.mapView = mapView; 
        this.bitmap = bitmap; 
    } 
 
    @Override 
    public void draw(Canvas canvas, MapView arg1, boolean arg2) { 
        projection = mapView.getProjection(); 
        point = new Point(); 
        projection.toPixels(geoPoint, point);// 將GeoPoint 轉換成point. 
        int x = point.x – bitmap.getWidth() / 2; 
        int y = point.y – bitmap.getHeight(); 
 
        canvas.drawBitmap(bitmap, x, y, new Paint()); 
    } 

示例顯示:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。