2015年8月10日 星期一

OSMDROID: Overlay


介紹Introduction


Overlay 可以說是OSMDROID中一個恨重要的一部分,因為這個物件可以讓我們的地圖擁有更多的功能,像是在地圖上加上其他地圖(如鐵軌地圖等),或著是增加判定(如按住時要出現什麼功能)

範例Example


首先我們先建立一個類別,然後將他繼承Overlay 繼承之後他會顯示錯誤,因為必須要在Override
draw(Canvas canvas, MapView mapView, boolean b)
這個method
public class DemoOverlay extends Overlay {
    @Override
    protected void draw(Canvas canvas, MapView mapView, boolean b) {}//繪製地圖
}
當我們Override之後還是會發現,IDE依舊顯示說他錯誤,原因在於Overlay本身沒有預設建構元,所以我們必須針對我們所定義的類別寫一個建構元, 但就如同我前面所寫,Overlay本身沒有預設建構元,那我們就會想問那要怎麼樣才能正確的定義好呢?這時候我們就要來思考Overlay這個類別特性了 Overlay他是一個建立在MapView上面的一層圖層,而MapView是Activity的內容之一,那我們就可以針對這點去查一下API,果然Overlay本身就有一個建構元叫做
public Overlay(Context context)
這時我們的IDE就不會再報錯了,那我們的基本型也就完成了
public class DemoOverlay extends Overlay {
    public DemoOverlay(Context ctx){ //初始建構元,如果沒有這個會報錯誤,因為Overlay本身沒有定義空白建構元
        super(ctx);
    }
    @Override
    protected void draw(Canvas canvas, MapView mapView, boolean b) {} //繪製地圖
}
以下是個小小的範例,這個程式碼是在說當使用者按住螢幕的時候,就會顯示"Long Press"的提示文字
public class DemoOverlay extends Overlay {
    Context ctx;
    public DemoOverlay(Context ctx){ //初始建構元,如果沒有這個會報錯誤,因為Overlay本身沒有定義空白建構元
        super(ctx);
        this.ctx = ctx;
    }
    @Override
    protected void draw(Canvas canvas, MapView mapView, boolean b) { //繪製地圖

    }

    @Override
    public boolean onLongPress(MotionEvent e, MapView mapView) { //判定按住時,要做什麼
        Toast.makeText(ctx,"Long Press",Toast.LENGTH_SHORT);
        return super.onLongPress(e, mapView);
    }
}

那我們現在完成Overlay了,但是你會發現為什麼我們的Overlay沒有作用呢? 那是因為我們還需要把他載入到我們的MapView當中 載入方式非常簡單
DemoOverlay demoOverlay = new DemoOverlay(this);//宣告一個DemoOverlay的物件
mapView.getOverlays().add(demoOverlay);//mapView是你所宣告的MapView物件

mapView加入Overlay有先後順序,所以我建議如果是顯示層的Overlay(如鐵路地圖、標示等)要比判定層的Overlay(如長按增測)還要早加入MapView當中

沒有留言:

張貼留言