??最近在使用高德地圖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年的帖子判族。
??我看了一下,該帖子弄巧成拙项戴,需要自己畫定位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();
}
}
}
}