轉(zhuǎn)載請注明阿宅!
前言
使用高德SDK實現(xiàn)定位及周邊的搜索界面候衍,先看效果圖:
使用到了高德以下sdk:
com.amap.api:3dmap:latest.integration
com.amap.api:search:latest.integration
思路分析
本文不對高德sdk的集成做介紹妖异,主要說說實現(xiàn)該頁面的思路惋戏。
需求:
- 進入頁面自動定位,并且展示周邊
- 搜索地點他膳,并且展示該地點周邊
- 周邊列表的點擊响逢,然后切換地圖的定位藍點
具體實現(xiàn)
首先需要注意權(quán)限的獲取。
初始化高德相關(guān)的東西:
/**
* 初始化定位相關(guān)
*/
private fun initLocationAbout() {
val myLocationStyle = MyLocationStyle()
myLocationStyle.showMyLocation(true)
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW)
//設(shè)置默認定位按鈕是否顯示
mMap.uiSettings.isMyLocationButtonEnabled = false
//設(shè)置為true表示啟動顯示定位藍點棕孙,false表示隱藏定位藍點并不進行定位龄句,默認是false
mMap.isMyLocationEnabled = true
mMap.myLocationStyle = myLocationStyle
//第一次定位
mMap.setOnMyLocationChangeListener {
val latLng = LatLng(it.latitude, it.longitude)
cameraMove(latLng)
}
mMap.setOnCameraChangeListener(object : AMap.OnCameraChangeListener {
override fun onCameraChangeFinish(p0: CameraPosition) {
cameraMarkers(p0.target)
//判斷是否需要搜索周邊
if (isSearchRound) {
poiSearch(p0.target)
}
isSearchRound = true
}
override fun onCameraChange(p0: CameraPosition) {
}
})
}
移動定位點的方法:
/**
* 移動地圖
* @param latLng 坐標
*/
private fun cameraMove(latLng: LatLng) {
//其中的18f表示的是地圖放大級別
val camera = CameraUpdateFactory.newCameraPosition(CameraPosition(latLng, 18f, 0f, 0f))
mMap.moveCamera(camera)
}
周邊搜索的方法:
/**
* 周邊搜索
*/
private fun poiSearch(latLng: LatLng) {
val point = LatLonPoint(latLng.latitude, latLng.longitude)
val geocodeSearch = GeocodeSearch(this)
val regeocodeQuery = RegeocodeQuery(point, 200f, GeocodeSearch.AMAP)
geocodeSearch.getFromLocationAsyn(regeocodeQuery)
geocodeSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener {
/**
* 逆地理編碼
*/
override fun onRegeocodeSearched(p0: RegeocodeResult, p1: Int) {
if (p1 == AMapException.CODE_AMAP_SUCCESS) {
//創(chuàng)建當前位置的poi
val nowPoiltem = PoiItem(
"111",
p0.regeocodeQuery.point,
"地圖位置",
p0.regeocodeAddress.formatAddress
)
nowPoiltem.adCode = p0.regeocodeAddress.adCode
nowPoiltem.provinceName = p0.regeocodeAddress.province
nowPoiltem.cityName = p0.regeocodeAddress.city
nowPoiltem.adName = p0.regeocodeAddress.district
val locationList = mutableListOf<PoiItem>()
//因為搜索的周邊列表并不包含當前搜索的位置,所以需要把當前位置插進去
locationList.add(nowPoiltem)
locationList.addAll(p0.regeocodeAddress.pois)
//周邊展示的Adapter
mAdapter.setCityAbout(
p0.regeocodeAddress.province,
p0.regeocodeAddress.city,
p0.regeocodeAddress.district
)
mAdapter.replaceData(locationList)
mAdapter.setEmptyView(mNoData)
} else {
mAdapter.setEmptyView(mErrorLoad)
}
}
/**
* 地理編碼
*/
override fun onGeocodeSearched(p0: GeocodeResult?, p1: Int) {
hideLoading()
}
})
}
關(guān)鍵字搜索:
/**
* 搜索關(guān)鍵字
*/
private fun doSearchQuery(keyWord: String) {
val query = PoiSearch.Query(keyWord, "", mCity)
query.pageSize = 50
query.pageNum = 0
//搜索
val poiSearch = PoiSearch(this, query)
poiSearch.setOnPoiSearchListener(this)
poiSearch.searchPOIAsyn()
showLoading()
}
/**
* 可以在回調(diào)中解析result散罕,獲取POI信息
* result.getPois()可以獲取到PoiItem列表分歇,Poi詳細信息可參考PoiItem類
* 返回結(jié)果成功或者失敗的響應(yīng)碼。1000為成功欧漱,其他為失斨奥铡(詳細信息參見網(wǎng)站開發(fā)指南-實用工具-錯誤碼對照表)
*/
override fun onPoiSearched(p0: PoiResult, p1: Int) {
hideLoading()
if (p1 == AMapException.CODE_AMAP_SUCCESS) {
mPopupLocation.replaceData(p0.pois)
//彈出框
mXPopup?.show()
} else {
App.mApplication.toast("搜索地址錯誤!")
}
}
周邊列表的點擊:
mAdapter.setOnItemClickListener { adapter, view, position ->
val data: PoiItem = adapter.data[position] as PoiItem
isSearchRound = false
mSelectLocation = position
mAdapter.selectLocation(position)
//移動點
val latLng = LatLng(data.latLonPoint.latitude, data.latLonPoint.longitude)
//創(chuàng)建
cameraMove(latLng)
}
頁面功能通過以上方法就能實現(xiàn)误甚,如果發(fā)現(xiàn)某些監(jiān)聽不會回調(diào)缚甩,先看看引入的sdk。在編寫時窑邦,我一開始引用的高德的2dmap擅威,發(fā)現(xiàn)地圖移動的監(jiān)聽不會回調(diào),然后換到3dmap就好了冈钦。