歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

在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.     
  5.   this.density = density;  
  6.   this.sb=sb;  
  7.   setPadding(10010, balloonBottomOffset);//設置位置   
  8.   layout = new LinearLayout(context);  
  9.   layout.setVisibility(VISIBLE);  
  10.   
  11.   LayoutInflater inflater = (LayoutInflater) context  
  12.     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  13.   //這一步先加載了彈出框的布局   
  14.   layoutView = inflater.inflate(R.layout.balloon_map_overlay, layout);  
  15.     
  16.   //彈出框中的兩行信息,可見R.id.balloon_item_title框圖中   
  17.   title = (TextView) layoutView.findViewById(R.id.balloon_item_title);  
  18.   snippet = (TextView) layoutView.findViewById(R.id.balloon_item_snippet);  
  19.   System.out.println("布局加載都好了");  
  20.   
  21.  }  

有些參數不是為了框架的搭建,我們先不講,為了從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