1. 程式人生 > >Android 百度地圖sdk 標註圖marker中可以切換顯示不同內容

Android 百度地圖sdk 標註圖marker中可以切換顯示不同內容

記錄一個前段時間解決的功能需求
先直接上圖片看看實現後的效果:
這是預設顯示的效果

這是點選按鈕以後的效果

具體需求為,在地圖頁上顯示出所有的場站marker之後,點選左側的按鈕可以實現動態切換場站marker中顯示的資料。

實現思路為:構造marker時,icon方法中傳入的引數BitmapDescriptor設定為一個自定義的view,而不是一張簡單圖片,在這個view中,將大頭針圖片設定為view背景,上面放一個textview,點選按鈕的時候,改變textview上面的值就可以了。
(如果沒明白繼續往下看↓)

====================================

在實現這個需求之前,有必要先了解一下覆蓋物(Overlay)的構造方式

1、在百度地圖中新增覆蓋物,需要傳入的引數是覆蓋物的設定,返回值為Overlay

Overlay com.baidu.mapapi.map.BaiduMap.addOverlay(OverlayOptions arg0)

2、那麼接下來關鍵就落在了OverlayOptions這個重要的類上面,通過檢視api發現,在實現具體功能的時候我們需要用到的是他的一系列子類

ArcOptions, CircleOptions, DotOptions, GroundOverlayOptions, MarkerOptions, PolygonOptions, PolylineOptions, TextOptions

這些子類各有各的特點,這裡只說MarkerOptions,我叫他標註物的設定
而觀察MarkerOptions這個類的方法會發現,大部分方法的返回值都是MarkerOptions,也就是說建立他的時候可以一路“點”出來
各種各樣的屬性設定很多,本文就不多說,API上介紹的都很清楚

一般的建立方式是這樣的:

MarkerOptions ooA = null;
...
ooA=newMarkerOptions().position(llA).icon(free_view).zIndex(9).draggable(false).extraInfo(mBundle);

==============================================

接下來到重點了
要做出題目中的需求,上面建立ooA的過程中,最重要的方法就是.icon()這個方法了,這個方法顧名思義就是為marker設定顯示出的圖示、樣式,括號中接收的引數是BitmapDescriptor

MarkerOptions.icon(BitmapDescriptor arg0)

也就是說這個icon的來源是一個BitmapDescriptor
查詢之後發現BitmapDescriptor的構成方式有以下幾種

static BitmapDescriptor fromAsset(java.lang.String  assetName)
根據資源名稱建立bitmap描述資訊
static BitmapDescriptor fromAssetWithDpi(java.lang.String assetName)
根據資源名稱和dpi建立bitmap描述資訊,根據不同裝置的dpi,對asset下圖片等比例縮放
static BitmapDescriptor fromBitmap(Bitmap image)
根據 Bitmap 建立描述資訊
static BitmapDescriptor fromFile(java.lang.String fileName)
根據應用程式私有資料夾裡包含檔案的檔名建立 bitmap 描述資訊
static BitmapDescriptor fromPath(java.lang.String absolutePath)
根據檔案絕對路徑建立 bitmap 描述資訊
static BitmapDescriptor fromResource(int resourceId)
根據資源 Id 建立 bitmap 描述資訊
static BitmapDescriptor fromView(View view)
根據一個 View 建立 Bitmap 描述資訊, 當 view 為 null 時返回 null

觀察之後,很顯然最後一個fromView(View view)是我們需要的

然後畫一個我們需要的佈局出來:

<LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/icon" >

            <TextView
                android:id="@+id/tv_num_price"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="¥99"
                android:textSize="9sp" />
        </LinearLayout>

接下來就是在程式碼裡添加了:

1、首先通過上面的佈局做一個view出來,並且找到那個textview,然後給textview 賦值

View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop_main_marker, null);

TextView tv_num_price=(TextView) view.findViewById(R.id.tv_num_price);

tv_num_price.setText("標註物上面你想顯示的資訊");

2、做出BitmapDescriptor

BitmapDescriptor free_view = BitmapDescriptorFactory.fromView(view);

3、建立MarkerOptions

MarkerOptions ooA = null;
...
ooA=newMarkerOptions().position(llA).icon(free_view).zIndex(9).draggable(false).extraInfo(mBundle);

4、在百度地圖中顯示出標註物

mBaiduMap.addOverlay(ooA)

5、到這裡主要部分就基本完成了,下面就是設定一個按鈕,點選的時候傳不同的顯示資訊過去給marker顯示,這部分這裡簡單說一下
構造一個功能為顯示地圖上全部marker的方法,傳入的引數為(顯示marker用到的資料集合,標記當前需要顯示什麼內容的flag),當點選切換按鈕後,呼叫一次該方法,根據業務邏輯傳入當前需要顯示內容的flag(如價格),在方法中判斷該flag對應的顯示內容即可。

如有問題,請留言交流。