高德地圖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申請、動(dòng)態(tài)權(quán)限申請、初始化布局的,我就不多說了,請移步官方文檔。
??思路很簡單,根本不需要自己畫定位,就是開啟系統(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)不不佳,請稍候...", 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 對象添加到地圖上
        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);
        //給定位客戶端對象設(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è)置縮放級別
                    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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容