登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

百度实现移动地图+选址功能

[复制链接]
来自: MrlLee 分类: Android精品源码 上传时间: 2016-6-12 11:37:13
Tag:百度地图 Failed commit latest 博客

项目介绍:

Permalink
Failed to load latest commit information.
MoveLocation 地图移动选址 Oct 13, 2015
.gitignore Initial commit Oct 13, 2015
LICENSE Initial commit Oct 13, 2015
MoveLocation.gif 移动地图定位选址 Oct 13, 2015
README.md 博客地址 Oct 13, 2015
说明.md 说明 Oct 13, 2015

游客,如果您要查看本帖隐藏内容请回复

定位+移动选址



  • 百学须先立志---学前须知:



    我们经常在各大主流APP上要求被写上地址,如百度外卖、爱鲜蜂收货地址等等;其中他们大多数是可以让我们在地图上移动选址。就如下面这段GIF演示的一样:



    最终演示


  • 尽信书,不如无书---能学到什么?



    1、地图状态MapStatus类及监听setOnMapStatusChangeListener
    2、定位LocationClient类
    3、反地理编码GeoCoder类


  • 工欲善其事必先利其器---申请Key



    百度地图访问应用(AK)申请地址:http://lbsyun.baidu.com/apiconsole/key



  • 兵马未动,粮草先行---导入百度地图jar包



    1、 进入百度地图API-首页



    百度地图API-首页



    2、鼠标移动到 开发 标签页上,选择 Android地图SDK



    Android地图SDK



    3、选择 相关下载



    相关下载



    4、选择 全部下载 (此时这里会跳转到新的下载页面)



    全部下载



    5、选择 相对应的开发包(本教程大家选择和下图标注的一样即可)



    开发包



    6、导入jar包到工程


    导入jar包到工程


  • 权限及服务---AndroidManifest



    [Java] 查看源文件 复制代码
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
        
    
        
        
    
        
            
            
                
                    
    
                    
                
            
        
    
        
            
                
            
        
    
    
    
    


    AndroidManifest


  • 配置.so文件及其他---build.gradle



    [Java] 查看源文件 复制代码
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 23
        buildToolsVersion \"23.0.0\"
    
        defaultConfig {
            applicationId \"com.scp\"
            minSdkVersion 14
            targetSdkVersion 23
            versionCode 1
            versionName \"1.0\"
        }
        buildTypes {
            release {
                //代码混淆
                minifyEnabled false
                //zip优化
                zipAlignEnabled true
                //移除无用的resource文件
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'com.android.support:appcompat-v7:23.0.0'
        compile files('libs/BaiduLBS_Android.jar')
    }
    
    


    build.gradle


  • 主布局---activity_main.xml



    首先我们先分析一下,整个布局结构上面是百度的 MapView (地图区域)下面是一个 ListView(选址列表区域) ,乍一看好像是如下图描述一样:



    布局



    [Java] 查看源文件 复制代码
    
    
    
        
    
        
    
    
    


    从布局中我们可以看到 MapView 占了250dp(大家自己可以随意给个值,不要太小即可)。下面的 ListView 则是填充了剩余的空间。


  • 第一步:基础地图



    [Java] 查看源文件 复制代码
    public class MainActivity extends AppCompatActivity {
    
        private MapView mMapView;
        private BaiduMap mBaiduMap;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //在使用SDK各组件之前初始化context信息,传入ApplicationContext
            //注意该方法要再setContentView方法之前实现
            SDKInitializer.initialize(getApplicationContext());
            //requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        private void initView() {
            mMapView = (MapView) findViewById(R.id.main_bdmap);
            mBaiduMap = mMapView.getMap();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            // activity 恢复时同时恢复地图控件
            mMapView.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            // activity 暂停时同时暂停地图控件
            mMapView.onPause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            // activity 销毁时同时销毁地图控件
            mMapView.onDestroy();
            mMapView = null;
        }
    
    }
    


    这里我们的 MainActivity 继承的是 AppCompatActivity,继承 Activity 也行。



    [Java] 查看源文件 复制代码
    //在使用SDK各组件之前初始化context信息,传入ApplicationContext
    //注意该方法要再setContentView方法之前实现
    SDKInitializer.initialize(getApplicationContext());
    


    这段代码一段要放在 setContentView(R.layout.activity_main); 之前。继续往下看,其中有一句代码

    [Java] 查看源文件 复制代码
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    被注释掉了,需要去掉标题栏的朋友可以加上这句代码。下面呢还有另外一种方法去掉标题栏,打开我们的 style.xml



    没改之前



    改成 Theme.AppCompat.Light.NoActionBar



    改完之后



    运行效果图:



    基础地图


  • 第二步:定位



    继续书写我们的MainActivity里面的代码:



    [Java] 查看源文件 复制代码
    public class MainActivity extends AppCompatActivity implements BDLocationListener, OnGetGeoCoderResultListener, BaiduMap.OnMapStatusChangeListener {
    
        private MapView mMapView;
        private BaiduMap mBaiduMap;
        private ListView poisLL;
        /**
         * 定位模式
         */
        private MyLocationConfiguration.LocationMode mCurrentMode;
        /**
         * 定位端
         */
        private LocationClient mLocClient;
        /**
         * 是否是第一次定位
         */
        private boolean isFirstLoc = true;
        /**
         * 定位坐标
         */
        private LatLng locationLatLng;
        /**
         * 定位城市
         */
        private String city;
        /**
         * 反地理编码
         */
        private GeoCoder geoCoder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //在使用SDK各组件之前初始化context信息,传入ApplicationContext
            //注意该方法要再setContentView方法之前实现
            SDKInitializer.initialize(getApplicationContext());
            //requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        private void initView() {
            mMapView = (MapView) findViewById(R.id.main_bdmap);
            mBaiduMap = mMapView.getMap();
    
            poisLL = (ListView) findViewById(R.id.main_pois);
    
            //定义地图状态
            MapStatus mMapStatus = new MapStatus.Builder().zoom(18).build();
            MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
            //改变地图状态
            mBaiduMap.setMapStatus(mMapStatusUpdate);
    
            //地图状态改变相关监听
            mBaiduMap.setOnMapStatusChangeListener(this);
    
            //开启定位图层
            mBaiduMap.setMyLocationEnabled(true);
    
            //定位图层显示方式
            mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
    
            /**
             * 设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效
             * customMarker用户自定义定位图标
             * enableDirection是否允许显示方向信息
             * locationMode定位图层显示方式
             */
            mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));
    
            //初始化定位
            mLocClient = new LocationClient(this);
            //注册定位监听
            mLocClient.registerLocationListener(this);
    
            //定位选项
            LocationClientOption option = new LocationClientOption();
            /**
             * coorType - 取值有3个:
             * 返回国测局经纬度坐标系:gcj02
             * 返回百度墨卡托坐标系 :bd09
             * 返回百度经纬度坐标系 :bd09ll
             */
            option.setCoorType(\"bd09ll\");
            //设置是否需要地址信息,默认为无地址
            option.setIsNeedAddress(true);
            //设置是否需要返回位置语义化信息,可以在BDLocation.getLocationDescribe()中得到数据,ex:\"在天安门附近\", 可以用作地址信息的补充
            option.setIsNeedLocationDescribe(true);
            //设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据
            option.setIsNeedLocationPoiList(true);
            /**
             * 设置定位模式
             * Battery_Saving
             * 低功耗模式
             * Device_Sensors
             * 仅设备(Gps)模式
             * Hight_Accuracy
             * 高精度模式
             */
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            //设置是否打开gps进行定位
            option.setOpenGps(true);
            //设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效
            option.setScanSpan(1000);
    
            //设置 LocationClientOption
            mLocClient.setLocOption(option);
    
            //开始定位
            mLocClient.start();
    
    
        }
    
        /**
         * 定位监听
         *
         * @param bdLocation
         */
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
    
            //如果bdLocation为空或mapView销毁后不再处理新数据接收的位置
            if (bdLocation == null || mBaiduMap == null) {
                return;
            }
    
            //定位数据
            MyLocationData data = new MyLocationData.Builder()
                    //定位精度bdLocation.getRadius()
                    .accuracy(bdLocation.getRadius())
                            //此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(bdLocation.getDirection())
                            //经度
                    .latitude(bdLocation.getLatitude())
                            //纬度
                    .longitude(bdLocation.getLongitude())
                            //构建
                    .build();
    
            //设置定位数据
            mBaiduMap.setMyLocationData(data);
    
            //是否是第一次定位
            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
                MapStatusUpdate msu = MapStatusUpdateFactory.newLatLngZoom(ll, 18);
                mBaiduMap.animateMapStatus(msu);
            }
    
            //获取坐标,待会用于POI信息点与定位的距离
            locationLatLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
            //获取城市,待会用于POISearch
            city = bdLocation.getCity();
    
            //创建GeoCoder实例对象
            geoCoder = GeoCoder.newInstance();
            //发起反地理编码请求(经纬度->地址信息)
            ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
            //设置反地理编码位置坐标
            reverseGeoCodeOption.location(new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()));
            geoCoder.reverseGeoCode(reverseGeoCodeOption);
    
            //设置查询结果监听者
            geoCoder.setOnGetGeoCodeResultListener(this);
        }
    
        //地理编码查询结果回调函数
        @Override
        public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
        }
    
        //反地理编码查询结果回调函数
        @Override
        public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
            List poiInfos = reverseGeoCodeResult.getPoiList();
            PoiAdapter poiAdapter = new PoiAdapter(MainActivity.this, poiInfos);
            poisLL.setAdapter(poiAdapter);
        }
    
    
        /**
         * 手势操作地图,设置地图状态等操作导致地图状态开始改变
         *
         * @param mapStatus 地图状态改变开始时的地图状态
         */
        @Override
        public void onMapStatusChangeStart(MapStatus mapStatus) {
        }
    
        /**
         * 地图状态变化中
         *
         * @param mapStatus 当前地图状态
         */
        @Override
        public void onMapStatusChange(MapStatus mapStatus) {
        }
    
        /**
         * 地图状态改变结束
         *
         * @param mapStatus 地图状态改变结束后的地图状态
         */
        @Override
        public void onMapStatusChangeFinish(MapStatus mapStatus) {
            //地图操作的中心点
            LatLng cenpt = mapStatus.target;
            geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(cenpt));
        }
    
        //回退键
        @Override
        public void onBackPressed() {
            finish();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            // activity 恢复时同时恢复地图控件
            mMapView.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            // activity 暂停时同时暂停地图控件
            mMapView.onPause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            //退出时停止定位
            mLocClient.stop();
            //退出时关闭定位图层
            mBaiduMap.setMyLocationEnabled(false);
    
            // activity 销毁时同时销毁地图控件
            mMapView.onDestroy();
    
            //释放资源
            if (geoCoder != null) {
                geoCoder.destroy();
            }
    
            mMapView = null;
        }
    }
    
    


    代码分段分析:



    放大地图



    这里我们放大了地图,zoom(18)【地图缩放级别 3~20】,接下来对我们的定位选项做一个简单的说明:



    定位选项



    当我们定位完了之后,我们就可以对定位好的数据进行处理了,简单说明一下我们的定位监听做了哪些事情:



    定位监听



    定位好了之后我们进行过反地理编码,下面说明一下反地理编码监听里面做了哪些事情:



    反地理编码监听


  • PoiAdapter



    这里会用到一张图 baidumap_ico_poi_on.png 大家右键另存为就行了:



    baidumap_ico_poi_on



    适配器视图 locationpois.xml



    [Java] 查看源文件 复制代码
    
    
    
        
    
            
        
    
        
    
    
    


    布局简单说明:



    布局说明



    实现类 PoiAdapter



    [Java] 查看源文件 复制代码
    public class PoiAdapter extends BaseAdapter {
        private Context context;
        private List pois;
        private LinearLayout linearLayout;
    
    
        PoiAdapter(Context context, List pois) {
            this.context = context;
            this.pois = pois;
        }
    
        @Override
        public int getCount() {
            return pois.size();
        }
    
        @Override
        public Object getItem(int position) {
            return pois.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.locationpois_item, null);
                linearLayout = (LinearLayout) convertView.findViewById(R.id.locationpois_linearlayout);
                holder = new ViewHolder(convertView);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            if (position == 0 && linearLayout.getChildCount() < 2) {
                ImageView imageView = new ImageView(context);
                ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(32, 32);
                imageView.setLayoutParams(params);
                imageView.setBackgroundColor(Color.TRANSPARENT);
                imageView.setImageResource(R.mipmap.baidumap_ico_poi_on);
                imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                linearLayout.addView(imageView, 0, params);
                holder.locationpoi_name.setTextColor(Color.parseColor(\"#FF5722\"));
            }
            PoiInfo poiInfo = pois.get(position);
            holder.locationpoi_name.setText(poiInfo.name);
            holder.locationpoi_address.setText(poiInfo.address);
            return convertView;
        }
    
        class ViewHolder {
            TextView locationpoi_name;
            TextView locationpoi_address;
    
            ViewHolder(View view) {
                locationpoi_name = (TextView) view.findViewById(R.id.locationpois_name);
                locationpoi_address = (TextView) view.findViewById(R.id.locationpois_address);
            }
        }
    }
    


    代码分段分析:



    poiAdapter具体实现


  • 地图状态变化---OnMapStatusChangeListener



    地图状态变化



    来看看我们现在运行是什么样子的:



    第一次运行



    大家移动一下地图试试。


  • 第三步:添加定位图标



    更改 activity_main.xml 布局文件:



    [Java] 查看源文件 复制代码
    
    
    
        
    
            
    
                
    
                
            
    
            
        
    
    
    


    居中图标



    此次没有任何实现代码添加或者改动,运行看一下效果:



    第二次运行



    大家移动一下地图试试。


  • 输入关键字显示相关地址列表



    首先我们先更改 activity_main.xml



    [Java] 查看源文件 复制代码
    
    
    
        
    
            
    
                
    
                
            
    
            
        
    
        
    
            
    
                
    
            
    
            
        
    
    
    
    


    代码说明:



    主布局



    接下来书写适配器的item布局 poisearch_item.xml



    [Java] 查看源文件 复制代码
    
    
    
        
    
        
    
            
    
            
        
    
    
    


    代码说明:



    适配器说明



    最终更改我们的 MainActivity 里面的代码 (请结合下面代码说明来看)



    [Java] 查看源文件 复制代码
    public class MainActivity extends AppCompatActivity implements BDLocationListener, OnGetGeoCoderResultListener, BaiduMap.OnMapStatusChangeListener, TextWatcher {
    
        private MapView mMapView;
        private BaiduMap mBaiduMap;
        private ListView poisLL;
        /**
         * 定位模式
         */
        private MyLocationConfiguration.LocationMode mCurrentMode;
        /**
         * 定位端
         */
        private LocationClient mLocClient;
        /**
         * 是否是第一次定位
         */
        private boolean isFirstLoc = true;
        /**
         * 定位坐标
         */
        private LatLng locationLatLng;
        /**
         * 定位城市
         */
        private String city;
        /**
         * 反地理编码
         */
        private GeoCoder geoCoder;
        /**
         * 界面上方布局
         */
        private RelativeLayout topRL;
        /**
         * 搜索地址输入框
         */
        private EditText searchAddress;
        /**
         * 搜索输入框对应的ListView
         */
        private ListView searchPois;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //在使用SDK各组件之前初始化context信息,传入ApplicationContext
            //注意该方法要再setContentView方法之前实现
            SDKInitializer.initialize(getApplicationContext());
            //requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        private void initView() {
            mMapView = (MapView) findViewById(R.id.main_bdmap);
            mBaiduMap = mMapView.getMap();
    
            poisLL = (ListView) findViewById(R.id.main_pois);
    
            topRL = (RelativeLayout) findViewById(R.id.main_top_RL);
    
            searchAddress = (EditText) findViewById(R.id.main_search_address);
    
            searchPois = (ListView) findViewById(R.id.main_search_pois);
    
            //定义地图状态
            MapStatus mMapStatus = new MapStatus.Builder().zoom(18).build();
            MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
            //改变地图状态
            mBaiduMap.setMapStatus(mMapStatusUpdate);
    
            //地图状态改变相关监听
            mBaiduMap.setOnMapStatusChangeListener(this);
    
            //开启定位图层
            mBaiduMap.setMyLocationEnabled(true);
    
            //定位图层显示方式
            mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
    
            /**
             * 设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效
             * customMarker用户自定义定位图标
             * enableDirection是否允许显示方向信息
             * locationMode定位图层显示方式
             */
            mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));
    
            //初始化定位
            mLocClient = new LocationClient(this);
            //注册定位监听
            mLocClient.registerLocationListener(this);
    
            //定位选项
            LocationClientOption option = new LocationClientOption();
            /**
             * coorType - 取值有3个:
             * 返回国测局经纬度坐标系:gcj02
             * 返回百度墨卡托坐标系 :bd09
             * 返回百度经纬度坐标系 :bd09ll
             */
            option.setCoorType(\"bd09ll\");
            //设置是否需要地址信息,默认为无地址
            option.setIsNeedAddress(true);
            //设置是否需要返回位置语义化信息,可以在BDLocation.getLocationDescribe()中得到数据,ex:\"在天安门附近\", 可以用作地址信息的补充
            option.setIsNeedLocationDescribe(true);
            //设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据
            option.setIsNeedLocationPoiList(true);
            /**
             * 设置定位模式
             * Battery_Saving
             * 低功耗模式
             * Device_Sensors
             * 仅设备(Gps)模式
             * Hight_Accuracy
             * 高精度模式
             */
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            //设置是否打开gps进行定位
            option.setOpenGps(true);
            //设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效
            option.setScanSpan(1000);
    
            //设置 LocationClientOption
            mLocClient.setLocOption(option);
    
            //开始定位
            mLocClient.start();
    
        }
    
        /**
         * 定位监听
         *
         * @param bdLocation
         */
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
    
            //如果bdLocation为空或mapView销毁后不再处理新数据接收的位置
            if (bdLocation == null || mBaiduMap == null) {
                return;
            }
    
            //定位数据
            MyLocationData data = new MyLocationData.Builder()
                    //定位精度bdLocation.getRadius()
                    .accuracy(bdLocation.getRadius())
                            //此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(bdLocation.getDirection())
                            //经度
                    .latitude(bdLocation.getLatitude())
                            //纬度
                    .longitude(bdLocation.getLongitude())
                            //构建
                    .build();
    
            //设置定位数据
            mBaiduMap.setMyLocationData(data);
    
            //是否是第一次定位
            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
                MapStatusUpdate msu = MapStatusUpdateFactory.newLatLngZoom(ll, 18);
                mBaiduMap.animateMapStatus(msu);
            }
    
            //获取坐标,待会用于POI信息点与定位的距离
            locationLatLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
            //获取城市,待会用于POISearch
            city = bdLocation.getCity();
    
            //文本输入框改变监听,必须在定位完成之后
            searchAddress.addTextChangedListener(this);
    
            //创建GeoCoder实例对象
            geoCoder = GeoCoder.newInstance();
            //发起反地理编码请求(经纬度->地址信息)
            ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
            //设置反地理编码位置坐标
            reverseGeoCodeOption.location(new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()));
            geoCoder.reverseGeoCode(reverseGeoCodeOption);
    
            //设置查询结果监听者
            geoCoder.setOnGetGeoCodeResultListener(this);
        }
    
        //地理编码查询结果回调函数
        @Override
        public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
        }
    
        //反地理编码查询结果回调函数
        @Override
        public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
            List poiInfos = reverseGeoCodeResult.getPoiList();
            PoiAdapter poiAdapter = new PoiAdapter(MainActivity.this, poiInfos);
            poisLL.setAdapter(poiAdapter);
        }
    
    
        /**
         * 手势操作地图,设置地图状态等操作导致地图状态开始改变
         *
         * @param mapStatus 地图状态改变开始时的地图状态
         */
        @Override
        public void onMapStatusChangeStart(MapStatus mapStatus) {
        }
    
        /**
         * 地图状态变化中
         *
         * @param mapStatus 当前地图状态
         */
        @Override
        public void onMapStatusChange(MapStatus mapStatus) {
        }
    
        /**
         * 地图状态改变结束
         *
         * @param mapStatus 地图状态改变结束后的地图状态
         */
        @Override
        public void onMapStatusChangeFinish(MapStatus mapStatus) {
            //地图操作的中心点
            LatLng cenpt = mapStatus.target;
            geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(cenpt));
        }
    
        /**
         * 输入框监听---输入之前
         *
         * @param s     字符序列
         * @param start 开始
         * @param count 总计
         * @param after 之后
         */
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
    
        /**
         * 输入框监听---正在输入
         *
         * @param s      字符序列
         * @param start  开始
         * @param before 之前
         * @param count  总计
         */
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }
    
        /**
         * 输入框监听---输入完毕
         *
         * @param s
         */
        @Override
        public void afterTextChanged(Editable s) {
            if (s.length() == 0 || \"\".equals(s.toString())) {
                searchPois.setVisibility(View.GONE);
            } else {
                //创建PoiSearch实例
                PoiSearch poiSearch = PoiSearch.newInstance();
                //城市内检索
                PoiCitySearchOption poiCitySearchOption = new PoiCitySearchOption();
                //关键字
                poiCitySearchOption.keyword(s.toString());
                //城市
                poiCitySearchOption.city(city);
                //设置每页容量,默认为每页10条
                poiCitySearchOption.pageCapacity(10);
                //分页编号
                poiCitySearchOption.pageNum(1);
                poiSearch.searchInCity(poiCitySearchOption);
                //设置poi检索监听者
                poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
                    //poi 查询结果回调
                    @Override
                    public void onGetPoiResult(PoiResult poiResult) {
                        List poiInfos = poiResult.getAllPoi();
                        PoiSearchAdapter poiSearchAdapter = new PoiSearchAdapter(MainActivity.this, poiInfos, locationLatLng);
                        searchPois.setVisibility(View.VISIBLE);
                        searchPois.setAdapter(poiSearchAdapter);
                    }
    
                    //poi 详情查询结果回调
                    @Override
                    public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
                    }
                });
            }
        }
    
    
        //回退键
        @Override
        public void onBackPressed() {
            finish();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            // activity 恢复时同时恢复地图控件
            mMapView.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            // activity 暂停时同时暂停地图控件
            mMapView.onPause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            //退出时停止定位
            mLocClient.stop();
            //退出时关闭定位图层
            mBaiduMap.setMyLocationEnabled(false);
    
            // activity 销毁时同时销毁地图控件
            mMapView.onDestroy();
    
            //释放资源
            if (geoCoder != null) {
                geoCoder.destroy();
            }
    
            mMapView = null;
        }
    
    }
    


    代码说明:



    最终说明



    最终运行效果与文章开篇展示效果一样,这里呢就不再重复贴图了。



相关源码推荐:

我来说两句
*滑动验证:
所有评论(69)
嘘丶~低调 2016-6-12 14:52:06
正需要啊,感谢楼主无私分享!
回复
嘘丶~低调 2016-6-12 14:52:21
学习学习!
回复
1075323459 2016-6-12 16:12:57
在那下载
回复
1075323459 2016-6-12 16:19:56
强烈支持楼主ing……
回复
123huanghuang 2016-6-13 09:46:31
楼主威武啊,安卓巴士有你更给力!
回复
浪花以朵朵 2016-6-13 10:02:39
666
回复
久留不走! 2016-6-13 11:31:16
学习学习  感谢楼主
回复
1315 0 0
代码贡献英雄榜
用户名 下载数
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,769657487

如何获得代码达人称号

如何成为签约作者

联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表