自定義地圖覆蓋物(包括自定義View和動畫的顯示)

官方例子

這個百度地圖 android SDK 關於基礎地圖覆蓋物的例子php

http://developer.baidu.com/map/wiki/index.php?title=androidsdk/guide/basicmap#.E6.A0.87.E6.B3.A8.E8.A6.86.E7.9B.96.E7.89.A9 android

 

 

//定義Maker座標點 
LatLng point = new LatLng(39.963175, 116.400244); 
//構建Marker圖標
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka); 
//構建MarkerOption,用於在地圖上添加
 Marker  OverlayOptions option = new MarkerOptions()  
    .position(point)  
    .icon(bitmap); 
//在地圖上添加Marker,並顯示  
mBaiduMap.addOverlay(option);

其中的Marker 也就是標記的意思,就是我們今天要說的覆蓋物,其中的難點在於它只接收一個bitmap來顯示,那假如當咱們有需求,須要加入一些複雜的View(好比Linearlayout嵌套一個TextView和ImageView)來代替這個bitmap怎麼辦?在我查了不少資料之後,終於找到了解決方案。web

 

覆蓋物(Marker)自定義

其實解決方案很簡單,就是將View或者Viewgroup轉化爲Bitmap就好了。由於地圖的SDK是第三方提供的,咱們沒有權利要求別人去改接口來適應咱們,因此咱們只好想辦法去適應他們。ide

如今我自定義了一個佈局,以下所示函數

point.xml佈局

<?xml version="1.0" encoding="utf-8"?>測試

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:background="@drawable/popup"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content">動畫

        <ImageView android:layout_width="35dp"
                   android:layout_height="35dp"
                   android:scaleType="centerCrop"
                   android:padding="5dip"
                   android:src="@drawable/head_1"/>ui

        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:textColor="@android :color/black"
                  android:textSize="20sp"
                  android:text="測試"
              />spa

</LinearLayout>

而後想讓它轉爲Bitmap以後,裝進Marker。下面是核心轉換函數:

    private Bitmap getViewBitmap(View addViewContent) {

        addViewContent.setDrawingCacheEnabled(true);

        addViewContent.measure(
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        addViewContent.layout(0, 0,
                addViewContent.getMeasuredWidth(),
                addViewContent.getMeasuredHeight());

        addViewContent.buildDrawingCache();
        Bitmap cacheBitmap = addViewContent.getDrawingCache();
        Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);

        return bitmap;
    }

其中,最外層的佈局我用Relativelayout嘗試過,但沒法轉化獲得bitmap,深層次的緣由有興趣你們能夠試試。

只要最外層是LinearLayout,裏面的佈局你能夠隨意寫,無論再嵌套多少層其餘的佈局,好比Relativelayout,都能順利的顯示到地圖上。

覆蓋物(Marker)動畫

實現動畫的前提是,你要拿到當前只知道經緯度的這一點在屏幕上的位,拿到以後你就能夠作一個假動畫,把覆蓋物放到目標位置以後再根據經緯度添加真實的Marker。

下面是轉換代碼:

Point p = baiduMap.getProjection().toScreenLocation(target);

其實核心的就這一句,拿到target(類型爲LatLng)的點的經緯度信息後,將它轉化爲相對於屏幕上的點Point。

Point的x和y屬性就是當前相對屏幕的位置,以後你想作什麼動畫就隨便你了,仍是挺簡單,是吧。

 

效果圖

才接觸地圖不到2天,有錯誤的地方請指正,謝謝你們。

 

 

這裏是Freestyletime@foxmail.com,歡迎交流。

本人原創做品,轉載請標明出處。

相關文章
相關標籤/搜索