在Android中添加圖層的方法,一般來說是定義一個overlay對象,比如說屬於MyOverlay類,MyOverlay是繼承於ItemizedOverlay<Item>的,然後定義一個overlayitem,繼承於OverLayItem,在使用的時候就是新建一個overlayitem對象,overlayitem =new overlayitem (GeoPoint point, String directiondir, String routetag),point包含了這個點的經緯度,後面兩個數據就是你在點擊這個點的時候可以顯示的數據,當然至於你想怎麼顯示就看每個人不同的想法了。overlay在定義的時候會傳入一個圖片參數,以便顯示,然後就是把overlayitem對象加到overlay中,在點擊圖片的時候會調用MyOverlay中的OnTop方法。至於我們要顯示的兩個信息,就是overlayitem對象中的後兩個參數,我們可以根據點擊時得到的index來創建一個item,然後調用item的gettitle getsnippet方法來獲得兩個參數。
下面是添加自定義圖層,不是簡單的顯示一個圖標,但是這次這個也只是一個框架,還沒完全實現
這裡有這麼一個關系,BusOverlay繼承於BalloonItemizedOverlay<BusOverlayItem>,這個又繼承於ItemizedOverlay<Item>,對於BusOverlayItem,它繼承與OverlayItem,首先
- BusOverlay BusOverlay = new BusOverlay(drawable, this, stoptagList,mapView,density,style);
- BusOverlayItem overlayitem = new BusOverlayItem(point,"測試數據","測試數據");
- BusOverlay.addOverlay(overlayitem);
簡單的寫下創建兩個對象,然後將這個BusOverlayItem傳遞到BusOverlay中。剛才說到BusOverlayItem的後面兩個參數是點擊時顯示數據的地發,這裡為什麼用測試數據呢,我們待會再說。然後我們進入OnTop方法,在點擊圖層的時候,
- boolean ret=BusOverlay.super.onTap(index);
我們先返回他父類的OnTop方法,這裡我們要顯示的彈出框用的是FrameLayout類型的對象,FrameLayout就是可以顯示彈出框的那種樣式的嘛,我們新建一個BalloonoverLayView <Item extends OverlayItem>,繼承與FrameLayout,再創建一個BusPopupView,這個類的對象就是我們要顯示的框實體。
- protected BalloonoverLayView<Item> balloonView;//矩形提示框
在OnTop方法中,如果這個類對象是空的話,我們就去創建這樣的一個實體。
- if (balloonView == null)
- balloonView = createBalloonOverlayView();
在creatBalloonOverlayView方法中我們新建
- BusPopupView view = new BusPopupView(getMapView().getContext(),getBalloonBottomOffset(),density,sb);
參數我們先不管,這個類必然會調用BalloonoverLayView<Item>的構造函數,
在BalloonoverLayView<Item>的構造函數中,
- protected LinearLayout layout; private TextView title; private TextView snippet; protected View layoutView; protected float density; private StringBuffer sb;
- public BalloonoverLayView(Context context, int balloonBottomOffset,float density,StringBuffer sb) {
- super(context);
-
- this.density = density;
- this.sb=sb;
- setPadding(10, 0, 10, balloonBottomOffset);//設置位置
- layout = new LinearLayout(context);
- layout.setVisibility(VISIBLE);
-
- LayoutInflater inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- //這一步先加載了彈出框的布局
- layoutView = inflater.inflate(R.layout.balloon_map_overlay, layout);
-
- //彈出框中的兩行信息,可見R.id.balloon_item_title框圖中
- title = (TextView) layoutView.findViewById(R.id.balloon_item_title);
- snippet = (TextView) layoutView.findViewById(R.id.balloon_item_snippet);
- System.out.println("布局加載都好了");
-
- }
有些參數不是為了框架的搭建,我們先不講,為了從xml文件中直接引入我們的大致框架,用到layoutView = inflater.inflate(R.layout.balloon_map_overlay, layout);,根據文檔中創建layout。說明下,title和snippet是xml文件中的兩個控件,為了顯示上面文字用的。父類構造結束,我們回到BusPopupView的構造函數中,
- FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
- LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
- params.gravity = Gravity.NO_GRAVITY;
- addView(layout, params);
在子類中把剛才處理過的layout拿過來,繼承父類的數據嘛,添加到視圖中,此時BusPopupView的構造函數也結束了,那就返回了一個view嘛
BusPopupView view = new BusPopupView(getMapView().getContext(),getBalloonBottomOffset(),density,sb);
if (balloonView == null)
balloonView = createBalloonOverlayView();
這個view就是由ballooView接受。
- GeoPoint point = currentFocussedItem.getPoint();
- MapView.LayoutParams params = new MapView.LayoutParams(
- LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point,
- MapView.LayoutParams.BOTTOM_CENTER);
- params.mode = MapView.LayoutParams.MODE_MAP;
- //使得彈出框可見
- balloonView.setVisibility(View.VISIBLE);
- mapView.addView(balloonView, params);
我們只講顯示彈出框的框架,所以上面點擊以後觸發的方法就不寫了,至於其他方法以後再寫吧。還是一嘛
把剛才的視圖傳進來的balloonView 設置一下參數,然後將這個視圖加載mapview中。mapview是在構造函數中傳進來的,就是主窗口中的mapview。