高德2D地圖自定義定位,批量繪制或清除Marker的實現(xiàn) | Android開發(fā)

高德地圖

最近項目有一個功能需要實現(xiàn):通過后臺接口獲取經(jīng)緯度往踢,通過經(jīng)緯度在地圖上展示Marker坐標(biāo)腾誉,點擊坐標(biāo)展示詳情。

高德地圖有2D地圖和3D地圖兩種菲语,兩種地圖可實現(xiàn)的功能稍有差別妄辩。

官方說明截圖

主要來講:
1.3D比2D可實現(xiàn)更多顯示效果。
2.3D地圖必須要導(dǎo)入so文件山上,打包后會比較大眼耀。

我自己實測在使用3D地圖SDK導(dǎo)入arm64-v8a,armeabi,armeabi-v7a三個so文件后,release包大了35mb左右佩憾,這顯然是不太能接受的哮伟,所以果斷在項目中使用了2D地圖SDK。

下面介紹2D地圖開發(fā)中遇到的一些問題及處理方法妄帘,高德SDK的基本配置就不在這里介紹了楞黄。

一、2D地圖批量繪制Marker

2D地圖提供的API比3D少很多抡驼,比如3D有批量繪制Marker和清除全部Marker方法鬼廓,2D都沒有碎税,只能循環(huán)使用添加Marker的方法雷蹂。添加后地圖不能自動縮放匪煌,在頁面中包含全部Marker党巾,需要調(diào)用AMap類中animateCamera()方法。

drawMarker(latLng);
//通過此方法縮小或擴(kuò)大地圖,將所有坐標(biāo)顯示在頁面內(nèi)
//第二個參數(shù)為四周留空寬度
aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(boundsBuilder.build(), 15));

而且在批量繪制Marker后驳规,使用AMap類的clear()方法清除Marker同時也會清除定位藍(lán)點,再次點擊定位按鈕,藍(lán)點也無法再次顯示巩搏。也只能通過循環(huán)遍歷每一個Marker贯底,調(diào)用Marker的remove()方法進(jìn)行清除撒强。

    /*******存儲所有Marker**********/
    List<Marker> mAllMarker = new ArrayList<>();

    /**
     * 清除所有Marker
     */
    private void clearAllMarker() {
        for (Marker marker : mAllMarker) {
            marker.remove();
        }
        mAllMarker.clear();
    }


二胚想、2D地圖自定義定位按鈕

除了繪制Marker芽隆,高德地圖的定位按鈕默認(rèn)是在右上角,顯得很難看牙躺。


demo圖

我們?nèi)粘J褂玫貓D軟件都是在左下角或者右下角孽拷。

高德地圖APP截圖
微信位置截圖

查閱API沒有對定位按鈕位置的設(shè)置,只能進(jìn)行自定義代虾。
1.隱藏高德自帶的定位按鈕棉磨,在布局右下角加一個button按鈕乘瓤,通過系統(tǒng)的點擊監(jiān)聽進(jìn)行操作。
2.通過AMap類getMyLocation()方法獲取定位位置抬吟,然后移動地圖到定位點的坐標(biāo)火本。

  //自定義定位到當(dāng)前地點,通過獲取經(jīng)緯度,移動到地圖上的位置
  Location location = aMap.getMyLocation();
  aMap.animateCamera(CameraUpdateFactory.changeLatLng(new LatLng(location.getLatitude(), location.getLongitude())));

ps:另外還可以通過定位后回調(diào)的方式進(jìn)行控制,這個方法稍微麻煩一些茫陆,這里就不做介紹簿盅,詳見3D地圖demo中的 “Location幾種模式_5.0.0之前的實現(xiàn)”
http://lbs.amap.com/api/android-sdk/download/

另外桨醋,點擊定位時發(fā)現(xiàn)定位按鈕點擊時會變藍(lán)色


點擊時的效果

于是我扒了一下SDK中asset文件喜最,找到了高德用的定位圖片步责,編寫selector文件蔓肯,實現(xiàn)相同的點擊效果蔗包。

高德asset文件中包含相關(guān)的圖片文件


三调限、getInfoWindow(Marker marker)和getInfoContents(Marker marker)方法的使用

這兩個方法的主要區(qū)別就是getInfoWindow不可自定義view背景耻矮,在創(chuàng)建View視圖的時候會使用SDK中infowindow_bg2d.9.png文件。SDK雖然已經(jīng)被混淆過了踱承,但是相關(guān)邏輯還是能看出來茎活。

//package com.amap.api.mapcore2d包下,b類,911行方法.
  public void a(ab var1) throws RemoteException {
        String var2 = "showInfoWindow";
        LayoutParams var3 = null;
        if(var1 != null) {
            if(var1.getTitle() != null || var1.getSnippet() != null) {
                this.e();
                Marker var4 = new Marker(var1);
                if(this.T != null) {
                   //賦值getInfoWindow()方法
                    this.R = this.T.getInfoWindow(var4);
                }

                try {
                    if(this.W == null) {
                        //創(chuàng)建時添加背景圖
                        this.W = bd.a(this.n, "infowindow_bg2d.9.png");
                    }
                } catch (Exception var9) {
                    cm.a(var9, "AMapDelegateImpGLSurfaceView", var2);
                }

                if(this.R == null && this.T != null) {
                  //this.R實際為getInfoWindow()方法,所以如果沒有使用getInfoWindow()方法,
                  //則使用getInfoContents()方法,getInfoContents()方法可以自定義背景
                    this.R = this.T.getInfoContents(var4);
                }

                if(this.R != null) {
                    if(this.R.getBackground() == null) {
                        this.R.setBackgroundDrawable(this.W);
                    }
                } else {
                    LinearLayout var5 = new LinearLayout(this.n);
                    var5.setBackgroundDrawable(this.W);
                    TextView var6 = new TextView(this.n);
                    var6.setText(var1.getTitle());
                    var6.setTextColor(-16777216);
                    TextView var7 = new TextView(this.n);
                    var7.setTextColor(-16777216);
                    var7.setText(var1.getSnippet());
                    var5.setOrientation(1);
                    var5.addView(var6);
                    var5.addView(var7);
                    this.R = var5;
                }

                var3 = this.R.getLayoutParams();
                this.R.setDrawingCacheEnabled(true);
                this.R.setDrawingCacheQuality(0);
                s var10 = var1.b();
                int var11 = -2;
                int var12 = -2;
                if(var3 != null) {
                    var11 = var3.width;
                    var12 = var3.height;
                }

                com.amap.api.mapcore2d.au.a var8 = new com.amap.api.mapcore2d.au.a(var11, var12, var1.getRealPosition(), -((int)var10.a) + var1.getWidth() / 2, -((int)var10.b) + 2, 81);
                this.U = (ay)var1;
                if(this.g != null) {
                    this.g.addView(this.R, var8);
                }

            }
        }
    }



順便吐槽一下高德:
1.2D有些方法在參考手冊里都沒有,只能復(fù)制方法名稱在3D的操作手冊中查找懒熙,而且方法說明很是簡單,這都給開發(fā)帶來了一定困難工扎。
2.個人提交工單基本等待時間都是兩天定庵,而且答非所問蔬浙,問的是2D地圖的問題畴博,給的竟然是3D地圖的API俱病,我也醉了亮隙。


相關(guān)demo已經(jīng)上傳至GitHub,demo中包含一個配置好的簽名文件溢吻,可以進(jìn)行debug和release打包促王。
https://github.com/duff627/AMap2DDemo/tree/master

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倡怎,隨后出現(xiàn)的幾起案子诈胜,更是在濱河造成了極大的恐慌焦匈,老刑警劉巖缓熟,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吕世,居然都是意外死亡梯投,警方通過查閱死者的電腦和手機(jī)分蓖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來终娃,“玉大人棠耕,你說我怎么就攤上這事窍荧〗淋瘢” “怎么了框咙?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵茉贡,是天一觀的道長。 經(jīng)常有香客問我者铜,道長腔丧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任作烟,我火速辦了婚禮愉粤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拿撩。我一直安慰自己衣厘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著影暴,像睡著了一般错邦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上型宙,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天魂拦,我揣著相機(jī)與錄音,去河邊找鬼屉来。 笑死,一個胖子當(dāng)著我的面吹牛慨绳,可吹牛的內(nèi)容都是我干的恢共。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼埋泵,長吁一口氣:“原來是場噩夢啊……” “哼琐馆!你這毒婦竟也來了歧胁?” 一聲冷哼從身側(cè)響起崭参,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤海洼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肖揣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年劲蜻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡雏门,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出息裸,到底是詐尸還是另有隱情访圃,我是刑警寧澤批糟,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布悄但,位于F島的核電站汁雷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厢漩。R本人自食惡果不足惜炸宵,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裹匙。 院中可真熱鬧惰匙,春花似錦秃臣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垫桂。三九已至师幕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诬滩,已是汗流浹背霹粥。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留碱呼,地道東北人蒙挑。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓宗侦,卻偏偏與公主長得像愚臀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矾利,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容