[Android百度地图SDK开发] (二)地图交互之定位
2015-08-04 15:21
447 查看
[Android百度地图SDK开发] (二)地图交互之定位
这一篇主要说下如何定位并且地图自动移动到当前位置
在上一篇博文中/article/1819778.html已经说了如何配置环境与第一次运行,*由于上一篇博文中下载的是单一的百度地图SDK,这次我们需要用定位相关,但是百度地图SDK是不包含定位相关的,所以还要下载定位的SDK…
为了以后的开发方便大家最好在下载SDK的时候进到选择界面把未来可能要用到的功能都勾选上,然后点击开发包进行下载,下载地址 http://lbsyun.baidu.com/sdk/download?selected=location
这样解压后,就会获得一个完整的开发SDK
把armeabi和BaiduLBS_android.jar直接放到libs就OK了
进入主题:
关于定位的核心代码
a.定位的初始化
b.定位监听的实现
c.更换定位点图标
d.更换定位模式
定位有四种模式,普通 跟随 罗盘,具体效果自己实践 : )
本例详细源码:
activity_main
MyApplication.java
MainActivity.java
Androidmanifest
运行截图
有什么问题可以在下方评论,感谢。
这一篇主要说下如何定位并且地图自动移动到当前位置
在上一篇博文中/article/1819778.html已经说了如何配置环境与第一次运行,*由于上一篇博文中下载的是单一的百度地图SDK,这次我们需要用定位相关,但是百度地图SDK是不包含定位相关的,所以还要下载定位的SDK…
为了以后的开发方便大家最好在下载SDK的时候进到选择界面把未来可能要用到的功能都勾选上,然后点击开发包进行下载,下载地址 http://lbsyun.baidu.com/sdk/download?selected=location
这样解压后,就会获得一个完整的开发SDK
把armeabi和BaiduLBS_android.jar直接放到libs就OK了
进入主题:
关于定位的核心代码
a.定位的初始化
// 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 定位初始化 mLocClient = new LocationClient(this); //设置监听 mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); // 设置坐标类型 option.setScanSpan(1000); mLocClient.setLocOption(option); //开始定位 mLocClient.start();
b.定位监听的实现
public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { //保存当前位置 doublex=location.getLatitude(); doubley=location.getLongitude(); // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) return; // 构造定位数据 MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); //如果是第一次定位需要把地图移动到当前点 if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } } public void onReceivePoi(BDLocation poiLocation) { } }
c.更换定位点图标
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo); mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
d.更换定位模式
定位有四种模式,普通 跟随 罗盘,具体效果自己实践 : )
//跟随模式 mCurrentMode = LocationMode.FOLLOWING; mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
本例详细源码:
activity_main
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginTop="80dp" android:minWidth="100dp" android:orientation="vertical" android:padding="2dp" > <RadioGroup android:id="@+id/radioGroup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="定位icon" > <RadioButton android:id="@+id/defaulticon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="默认图标" > </RadioButton> <RadioButton android:id="@+id/customicon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="自定义图标" > </RadioButton> </RadioGroup> </LinearLayout> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="25dp" android:layout_marginTop="10dp" /> <Button android:id="@+id/button2" android:onClick="reLocation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/button1" android:layout_below="@+id/linearLayout1" android:text="定位" /> </RelativeLayout>
MyApplication.java
package com.lijizhou.locationdemo; import com.baidu.mapapi.SDKInitializer; import android.app.Application; public class MyApplication extends Application{ @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); //初始化 SDK引用的Context SDKInitializer.initialize(getApplicationContext()); } }
MainActivity.java
package com.lijizhou.locationdemo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; public class MainActivity extends Activity { // 定位相关 LocationClient mLocClient; public MyLocationListenner myListener = new MyLocationListenner(); private LocationMode mCurrentMode; BitmapDescriptor mCurrentMarker; MapView mMapView; BaiduMap mBaiduMap; //保存当前位置点 double doublex; double doubley; // UI相关 OnCheckedChangeListener radioButtonListener; Button requestLocButton; // 是否首次定位 boolean isFirstLoc = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestLocButton = (Button) findViewById(R.id.button1); //默认定位模式为普通 mCurrentMode = LocationMode.NORMAL; requestLocButton.setText("普通"); //模式更改点击事件 OnClickListener btnClickListener = new OnClickListener() { public void onClick(View v) { switch (mCurrentMode) { case NORMAL: requestLocButton.setText("跟随"); mCurrentMode = LocationMode.FOLLOWING; mBaiduMap .setMyLocationConfigeration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker)); break; case COMPASS: requestLocButton.setText("普通"); mCurrentMode = LocationMode.NORMAL; mBaiduMap .setMyLocationConfigeration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker)); break; case FOLLOWING: requestLocButton.setText("罗盘"); mCurrentMode = LocationMode.COMPASS; mBaiduMap .setMyLocationConfigeration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker)); break; } } }; //更换定位点图标 requestLocButton.setOnClickListener(btnClickListener); RadioGroup group = (RadioGroup) this.findViewById(R.id.radioGroup); radioButtonListener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (checkedId == R.id.defaulticon) { // 传入null则,恢复默认图标 mCurrentMarker = null; mBaiduMap .setMyLocationConfigeration(new MyLocationConfiguration( mCurrentMode, true, null)); } if (checkedId == R.id.customicon) { // 修改为自定义marker mCurrentMarker = BitmapDescriptorFactory .fromResource(R.drawable.icon_geo); mBaiduMap .setMyLocationConfigeration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker)); } } }; group.setOnCheckedChangeListener(radioButtonListener); // 地图初始化 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 定位初始化 mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); // 设置坐标类型 option.setScanSpan(1000); mLocClient.setLocOption(option); //开始定位 mLocClient.start(); } /** * 定位SDK监听函数 */ public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { doublex=location.getLatitude(); doubley=location.getLongitude(); // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) return; MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } } public void onReceivePoi(BDLocation poiLocation) { } } //移动地图 点击定位按钮 地图移动回当前点 public void reLocation(View v){ LatLng ll = new LatLng(doublex, doubley); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } @Override protected void onPause() { mMapView.onPause(); super.onPause(); } @Override protected void onResume() { mMapView.onResume(); super.onResume(); } @Override protected void onDestroy() { // 退出时销毁定位 mLocClient.stop(); // 关闭定位图层 mBaiduMap.setMyLocationEnabled(false); mMapView.onDestroy(); mMapView = null; super.onDestroy(); } }
Androidmanifest
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.lijizhou.locationdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:name=".MyApplication" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="你的KEY" /> <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> </manifest>
运行截图
有什么问题可以在下方评论,感谢。
相关文章推荐
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- 【Android-22】下载离线包,然后解压缩到android sdk的安装目录下
- Android.mk文件分析
- Android 壁纸设置代码 详解
- Android基础——如何使用Service
- android 剪切图片
- android 4.2以上版本永不休眠
- android.util.Base64结尾加\n的问题
- Android开源项目第一篇——个性化控件(View)篇
- 在ubuntu12.04上编译android工程
- Android中Acition和Category常量表
- Android Studio Error—Gradle: 错误:编码 GBK 的不可映射字符的
- Android的ListView的每一个Item都有不同的布局
- android几个知识点笔记
- Android中图片大小和屏幕密度的关系讲解
- Android中图片大小和屏幕密度的关系讲解
- Android初学习 - 4.0以后支持的Switch按钮
- Android屏幕适配
- AndroidStudio虚拟机启动失败
- Android BatteryStatsHelper深入理解(and5.1)