高德地圖SDK——自定義定位+動(dòng)畫移動(dòng)

??最近在使用高德地圖SDK安卓版做開發(fā),用過高德SDK自帶定位的肯定知道卜朗,這個(gè)定位按鈕的位置固定在MapView的右上角登馒,無法調(diào)整位置义矛、替換圖標(biāo),只能選擇是否顯示缸榛。而且這個(gè)定位是沒有動(dòng)畫的吝羞,點(diǎn)擊定位,一瞬間畫面一閃内颗,就到了當(dāng)前位置钧排。還有就是點(diǎn)擊這個(gè)按鈕,你沒法在這個(gè)按鈕的點(diǎn)擊事件里加入其它功能(比如點(diǎn)擊定位同時(shí)均澳,地圖傾斜30°)恨溜,感覺Low爆了符衔!
??“自定義定位按鈕”這是個(gè)很基礎(chǔ)的需求,官方文檔居然說SDK沒有提供自定義的功能糟袁,要實(shí)現(xiàn)還讓我去參考一個(gè)16年的帖子判族。

高德SDK官方文檔片段

??我看了一下,該帖子弄巧成拙项戴,需要自己畫定位Marker形帮、精度圈,誤導(dǎo)我走了很多彎路辩撑,簡直不能忍合冀!我花了點(diǎn)時(shí)間,以最簡單方式實(shí)現(xiàn)了氓仲,在這里寫出來,希望大家不要走我的老路晰洒,幫助大家實(shí)現(xiàn)快速接入!當(dāng)然這一切的前提砌滞,是你有一定的基礎(chǔ),已經(jīng)能夠正常顯示地圖打掘。集成SDK、配置清單文件横朋、apikey申請(qǐng)晰甚、動(dòng)態(tài)權(quán)限申請(qǐng)、初始化布局的止剖,我就不多說了,請(qǐng)移步官方文檔皮获。
??思路很簡單,根本不需要自己畫定位,就是開啟系統(tǒng)自帶的連續(xù)定位模式靠瞎,每2S定位一次,將獲取到的定位經(jīng)緯度保存下來父能,點(diǎn)擊定位按鈕,就將地圖視角動(dòng)畫移動(dòng)到當(dāng)前所在位置薛躬。
下面貼Activity的代碼:

public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener {

    private AMap mAMap;
    private AMapLocationClient mLocationClient;
    private OnLocationChangedListener mLocationListener;
    private boolean isFirstLoc;
    private LatLng mCurLocation;
    private String address;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initMapView(savedInstanceState);

        findViewById(R.id.locate).setOnClickListener(v -> {
            if (mCurLocation == null) {
                Toast.makeText(this, "當(dāng)前信號(hào)不不佳,請(qǐng)稍候...", Toast.LENGTH_SHORT).show();
                return;
            }
            // 如果獲取到定位信息坑夯,就將地圖視角動(dòng)畫移動(dòng)到定位點(diǎn)
            mAMap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(mCurLocation, 18, 0, 0)), 500, null);
            Toast.makeText(this, address, Toast.LENGTH_SHORT).show();
        });
    }

    private void initMapView(Bundle savedInstanceState) {
        MapView mMapView = findViewById(R.id.map);
        mMapView.onCreate(savedInstanceState);
        if (mAMap == null) {
            mAMap = mMapView.getMap();
            setUpMap();
        }
    }

    private void setUpMap() {
        // 設(shè)置定位監(jiān)聽
        mAMap.setLocationSource(this);
        // 設(shè)置為true表示顯示定位層并可觸發(fā)定位
        mAMap.setMyLocationEnabled(true);

        UiSettings uiSettings = mAMap.getUiSettings();
        uiSettings.setCompassEnabled(true);// 設(shè)置指南針是否顯示
        uiSettings.setZoomControlsEnabled(true);// 設(shè)置縮放按鈕是否顯示
        uiSettings.setScaleControlsEnabled(true);// 設(shè)置比例尺是否顯示
        uiSettings.setRotateGesturesEnabled(true);// 設(shè)置地圖旋轉(zhuǎn)是否可用
        uiSettings.setTiltGesturesEnabled(true);// 設(shè)置地圖傾斜是否可用
        uiSettings.setMyLocationButtonEnabled(false);// 設(shè)置默認(rèn)定位按鈕是否顯示

        // 自定義系統(tǒng)定位藍(lán)點(diǎn)
        MyLocationStyle myLocationStyle = new MyLocationStyle();
        //設(shè)置連續(xù)定位模式下的定位間隔,只在連續(xù)定位模式下生效,單次定位模式下不會(huì)生效指煎。單位為毫秒椭住。
        myLocationStyle.interval(2000);
        // 自定義定位藍(lán)點(diǎn)圖標(biāo)
        myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_gps_pos));
        // 自定義精度范圍的圓形邊框顏色
        myLocationStyle.strokeColor(Color.argb(0x44, 0, 0, 0xff));
        // 自定義精度范圍的圓形邊框?qū)挾?        myLocationStyle.strokeWidth(1);
        // 設(shè)置圓形的填充顏色
        myLocationStyle.radiusFillColor(Color.argb(0x22, 0, 0, 0xff));
        //連續(xù)定位宅广、藍(lán)點(diǎn)不自動(dòng)移動(dòng)到地圖中心點(diǎn),定位點(diǎn)依照設(shè)備方向旋轉(zhuǎn)些举,并且藍(lán)點(diǎn)會(huì)跟隨設(shè)備移動(dòng)(最常用的)
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
        // 將自定義的 myLocationStyle 對(duì)象添加到地圖上
        mAMap.setMyLocationStyle(myLocationStyle);

        mLocationClient = new AMapLocationClient(this);
        mLocationClient.setLocationListener(this);
        // 設(shè)置定位監(jiān)聽
        AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
        // 設(shè)置為高精度定位模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        // 設(shè)置是否返回地址信息(默認(rèn)返回地址信息)
        mLocationOption.setNeedAddress(true);
        //設(shè)置是否只定位一次,默認(rèn)為false
        mLocationOption.setOnceLocation(false);
        //設(shè)置是否強(qiáng)制刷新WIFI跟狱,默認(rèn)為強(qiáng)制刷新
        mLocationOption.setWifiScan(true);
        //設(shè)置是否允許模擬位置,默認(rèn)為false,不允許模擬位置
        mLocationOption.setMockEnable(false);
        //設(shè)置定位間隔,單位毫秒,默認(rèn)為2000ms
        mLocationOption.setInterval(2000);
        //緩存機(jī)制
        mLocationOption.setLocationCacheEnable(true);
        //給定位客戶端對(duì)象設(shè)置定位參數(shù)
        mLocationClient.setLocationOption(mLocationOption);
        //啟動(dòng)定位
        isFirstLoc = true;
        mLocationClient.startLocation();
    }

    @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {
        mLocationListener = onLocationChangedListener;
    }

    @Override
    public void deactivate() {
        mLocationListener = null;
        if (mLocationClient != null) {
            mLocationClient.stopLocation();
            mLocationClient.onDestroy();
        }
        mLocationClient = null;
    }

    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        if (mLocationListener != null && aMapLocation != null) {
            if (aMapLocation.getErrorCode() == AMapLocation.LOCATION_SUCCESS) {
                mCurLocation = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
                address = (aMapLocation.getProvince() + ""
                        + aMapLocation.getCity() + ""
                        + aMapLocation.getProvince() + ""
                        + aMapLocation.getDistrict() + ""
                        + aMapLocation.getStreet() + ""
                        + aMapLocation.getStreetNum());
                // 如果不設(shè)置isFirstLoc標(biāo)志位,此時(shí)再拖動(dòng)地圖時(shí)胧沫,它會(huì)不斷將地圖移動(dòng)到當(dāng)前的位置
                if (isFirstLoc) {
                    //設(shè)置縮放級(jí)別
                    mAMap.moveCamera(CameraUpdateFactory.zoomTo(18));
                    //將地圖移動(dòng)到定位點(diǎn)
                    mAMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation
                            .getLatitude(), aMapLocation.getLongitude())));
                    //點(diǎn)擊定位按鈕 能夠?qū)⒌貓D的中心移動(dòng)到定位點(diǎn)
                    mLocationListener.onLocationChanged(aMapLocation);
                    //獲取定位信息
                    Log.d(MainActivity.class.getSimpleName(), "MainActivity.onLocationChanged: " + address);
                    isFirstLoc = false;
                }
            } else {
                String errText = "定位失敗," + aMapLocation.getErrorCode() + ": " + aMapLocation
                        .getErrorInfo();
                Toast.makeText(this, errText, Toast.LENGTH_LONG).show();
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末江场,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窖逗,更是在濱河造成了極大的恐慌址否,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碎紊,死亡現(xiàn)場離奇詭異佑附,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)仗考,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門音同,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秃嗜,你說我怎么就攤上這事权均。” “怎么了锅锨?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵叽赊,是天一觀的道長。 經(jīng)常有香客問我必搞,道長必指,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任恕洲,我火速辦了婚禮塔橡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霜第。我一直安慰自己葛家,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布泌类。 她就那樣靜靜地躺著癞谒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扯俱,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音喇澡,去河邊找鬼迅栅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晴玖,可吹牛的內(nèi)容都是我干的读存。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼呕屎,長吁一口氣:“原來是場噩夢啊……” “哼让簿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秀睛,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤尔当,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蹂安,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椭迎,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年田盈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畜号。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡允瞧,死狀恐怖简软,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情述暂,我是刑警寧澤痹升,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贸典,受9級(jí)特大地震影響视卢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜廊驼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一据过、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妒挎,春花似錦绳锅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春原朝,著一層夾襖步出監(jiān)牢的瞬間驯嘱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工喳坠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鞠评,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓壕鹉,卻偏偏與公主長得像剃幌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晾浴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,170評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫负乡、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • For example, given the array [2,3,-2,4],the contiguous su...
    敲一手爛代碼閱讀 121評(píng)論 0 0
  • 我有一個(gè)特別喜歡的女老師Rene脊凰,她被我們cipt的同學(xué)稱為“麻辣老師”抖棘,她說的一句話我特別記憶猶新,Rene老師...
    慕蓉九兒閱讀 232評(píng)論 2 4