android 仿京东地址选择_Android 开发:仿美团地址选择
最近做了這個功能,分享一下,用的是百度地圖api,和美團外賣的地址選擇界面差不多,也就是可以搜索或者滑動地圖展示地址列表給用戶選擇,看下效果圖先。
文章重點
前言
這里先提一下,我們要選擇的地址信息其實是POI(Point of Interest),即“興趣點”。在地理信息系統中,一個POI可以是一棟房子、一個景點、一個郵筒或者一個公交站等。百度地圖SDK提供三種類型的POI檢索:城市內檢索、周邊檢索和區域檢索(即矩形區域檢索)。這里我就不詳細介紹了,具體請查看百度地圖開發文檔(http://lbsyun.baidu.com/index.php?title=androidsdk)。
需求分析
我們要實現的功能主要包括兩個操作:滑動地圖和搜索框搜索。
- 滑動地圖:滑動地圖主要是獲取滑動后地圖中心點坐標,然后獲取poi信息,但是這里不能用上面提到的三種POI檢索方式,POI檢索都需要傳入關鍵字(不能為空),而我們僅僅只是滑動地圖,所以需要用另外一種方式:逆地理編碼檢索。使用逆地理編碼檢索時,可以通過檢索結果ReverseGeoCodeResult類的getPoiList()方法獲取傳入位置周圍的POI信息。
- 搜索框搜索:這里就可以使用百度地圖SDK提供的三種POI檢索方式來進行檢索,同時為了方便查看,還可以計算出每個POI和用戶之間的距離。
一、展示地圖并定位到“我”的位置
1.展示地圖
展示地圖非常簡單,首先需要調用SDKInitializer.initialize()方法來進行初始化操作,它接收一個全局的Context參數,記得初始化操作一定要在setContentView()方法前調用(可以到application中進行初始化),然后調用findViewById()方法獲取MapView實例,最后記得要對MapView進行資源釋放。
2.移動到我的位置
2.1 獲取我的位置
首先要確定自己的位置,代碼如下所示:
public class MainActivity extends AppCompatActivity implements OnGetPoiSearchResultListener { private MyLocationListener myListener = new MyLocationListener(); public LocationClient mLocationClient = null; private LocationClientOption option = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initLocation(); } /** * 初始化定位相關 */ private void initLocation() { // 聲明LocationClient類 mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.setLocOption(option); // 注冊監聽函數 mLocationClient.registerLocationListener(myListener); mLocationClient.start(); } /** * 監聽當前位置 */ public class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(BDLocation location) { //mapView 銷毀后不在處理新接收的位置 if (location == null || mMapView == null) { return; } if (location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation) { Log.e(TAG, "當前“我”的位置:" + location.getAddrStr()); navigateTo(location); } } }}可以看到,我們首先創建LocationClient實例,然后調用LocationClient的registerLocationListener()方法來注冊一個定位監聽器,當獲取到位置信息的時候,就會回調這個定位監聽器。開啟定位很簡單,只需要調用一下LocationClient的start()方法就可以了。
定位的結果會回調到監聽器中,也就是MyLocationListener,在onReceiveLocation()方法中即可通過BDLocation對象獲取相關位置詳細信息。
注:定位屬于危險權限,所以要動態權限申請,記得不要忘記了。
2.2 移動到我的位置
獲取到定位后就需要將地圖中心點移動到當前位置,代碼如下:
private boolean isFirstLocation = true; /** * 根據獲取到的位置在地圖上移動“我”的位置 * * @param location */ private void navigateTo(BDLocation location) { double longitude = location.getLongitude(); double latitude = location.getLatitude(); if (isFirstLocation) { currentLatLng = new LatLng(latitude, longitude); MapStatus.Builder builder = new MapStatus.Builder(); MapStatus mapStatus = builder.target(currentLatLng).zoom(17.0f).build(); mBaiduMap.animateMapStatus(MapStatusUpdateFactory .newMapStatus(mapStatus)); isFirstLocation = false; } //讓“我”顯示在地圖上 MyLocationData.Builder locationBuilder = new MyLocationData.Builder(); locationBuilder.latitude(location.getLatitude()); locationBuilder.longitude(location.getLongitude()); MyLocationData locationData = locationBuilder.build(); mBaiduMap.setMyLocationData(locationData); }這里首先將位置信息封裝到LatLng對象中,然后調用MapStatusUpdateFactory的newMapStatus()將LatLng對象傳入,接著返回的MapStatusUpdate對象作為參數傳入到BaiduMap的animateMapStatus()方法中。上述代碼中還使用了一個變量來防止多次調用animateMapStatus()方法,因為移動地圖只需要在程序第一次定位時調用一次。
同時為了顯示一個當前設備的光標,可以利用MyLocationData.Builder類來實現,如代碼所示,就可將“我”顯示在地圖上了。
二、滑動地圖獲取poi(逆地理編碼)
1. 逆地理編碼
前面已經提到了,我們這里滑動地圖需要用到逆地理編碼,也就是反向地理解析,逆地理編碼就是將坐標轉換為詳細的地址信息,代碼如下:
//反向地理解析(含有poi列表) mGeoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(center)); /** * 反向地理解析,結果中含有poi信息,用于剛進入地圖和移動地圖時使用 */ private void initGeoCoder() { mGeoCoder = GeoCoder.newInstance(); mGeoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() { @Override public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) { } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) { if (reverseGeoCodeResult.error.equals(SearchResult.ERRORNO.NO_ERROR)) { //獲取poi列表 if (reverseGeoCodeResult.getPoiList() != null) { poiInfoListForGeoCoder = reverseGeoCodeResult.getPoiList(); } } else { Toast.makeText(mContext, "該位置范圍內無信息總結
以上是生活随笔為你收集整理的android 仿京东地址选择_Android 开发:仿美团地址选择的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python程序设计课程设计_《Pyth
- 下一篇: android timer后函数继续执行