歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 添加自定義圖層,圖層中可帶鏈接

Android 添加自定義圖層,圖層中可帶鏈接

日期:2017/3/1 11:02:56   编辑:Linux編程

在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,首先

  1. BusOverlay BusOverlay = new BusOverlay(drawable, this, stoptagList,mapView,density,style);
  2. BusOverlayItem overlayitem = new BusOverlayItem(point,"測試數據","測試數據");
  3. BusOverlay.addOverlay(overlayitem);

簡單的寫下創建兩個對象,然後將這個BusOverlayItem傳遞到BusOverlay中。剛才說到BusOverlayItem的後面兩個參數是點擊時顯示數據的地發,這裡為什麼用測試數據呢,我們待會再說。然後我們進入OnTop方法,在點擊圖層的時候,

  1. boolean ret=BusOverlay.super.onTap(index);

我們先返回他父類的OnTop方法,這裡我們要顯示的彈出框用的是FrameLayout類型的對象,FrameLayout就是可以顯示彈出框的那種樣式的嘛,我們新建一個BalloonoverLayView <Item extends OverlayItem>,繼承與FrameLayout,再創建一個BusPopupView,這個類的對象就是我們要顯示的框實體。

  1. protected BalloonoverLayView<Item> balloonView;//矩形提示框

在OnTop方法中,如果這個類對象是空的話,我們就去創建這樣的一個實體。

  1. if (balloonView == null)
  2. balloonView = createBalloonOverlayView();

在creatBalloonOverlayView方法中我們新建

  1. BusPopupView view = new BusPopupView(getMapView().getContext(),getBalloonBottomOffset(),density,sb);

參數我們先不管,這個類必然會調用BalloonoverLayView<Item>的構造函數,

在BalloonoverLayView<Item>的構造函數中,

  1. protected LinearLayout layout; private TextView title; private TextView snippet; protected View layoutView; protected float density; private StringBuffer sb;
  2. public BalloonoverLayView(Context context, int balloonBottomOffset,float density,StringBuffer sb) {
  3. super(context);
  4. this.density = density;
  5. this.sb=sb;
  6. setPadding(10, 0, 10, balloonBottomOffset);//設置位置
  7. layout = new LinearLayout(context);
  8. layout.setVisibility(VISIBLE);
  9. LayoutInflater inflater = (LayoutInflater) context
  10. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  11. //這一步先加載了彈出框的布局
  12. layoutView = inflater.inflate(R.layout.balloon_map_overlay, layout);
  13. //彈出框中的兩行信息,可見R.id.balloon_item_title框圖中
  14. title = (TextView) layoutView.findViewById(R.id.balloon_item_title);
  15. snippet = (TextView) layoutView.findViewById(R.id.balloon_item_snippet);
  16. System.out.println("布局加載都好了");
  17. }

有些參數不是為了框架的搭建,我們先不講,為了從xml文件中直接引入我們的大致框架,用到layoutView = inflater.inflate(R.layout.balloon_map_overlay, layout);,根據文檔中創建layout。說明下,title和snippet是xml文件中的兩個控件,為了顯示上面文字用的。父類構造結束,我們回到BusPopupView的構造函數中,

  1. FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
  2. LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  3. params.gravity = Gravity.NO_GRAVITY;
  4. addView(layout, params);

在子類中把剛才處理過的layout拿過來,繼承父類的數據嘛,添加到視圖中,此時BusPopupView的構造函數也結束了,那就返回了一個view嘛

BusPopupView view = new BusPopupView(getMapView().getContext(),getBalloonBottomOffset(),density,sb);
if (balloonView == null)
balloonView = createBalloonOverlayView();
這個view就是由ballooView接受。

  1. GeoPoint point = currentFocussedItem.getPoint();
  2. MapView.LayoutParams params = new MapView.LayoutParams(
  3. LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point,
  4. MapView.LayoutParams.BOTTOM_CENTER);
  5. params.mode = MapView.LayoutParams.MODE_MAP;
  1. //使得彈出框可見
  2. balloonView.setVisibility(View.VISIBLE);
  3. mapView.addView(balloonView, params);

我們只講顯示彈出框的框架,所以上面點擊以後觸發的方法就不寫了,至於其他方法以後再寫吧。還是一嘛

把剛才的視圖傳進來的balloonView 設置一下參數,然後將這個視圖加載mapview中。mapview是在構造函數中傳進來的,就是主窗口中的mapview。

Copyright © Linux教程網 All Rights Reserved