Android百度地图之方向感应和模式更改
本文实例为大家分享了android百度地图之方向感应和模式更改,供大家参考,具体内容如下
目标效果:
菜单中设置几种模式,点击可查看不同的地图形式,这里随便截几张图。
1.首先要去百度地图网站 http://lbsyun.baidu.com/
2.注册账号后,点击开发->android地图sdk->获取密钥,进入后显示如下页面。
3.创建应用
4.打开eclipse,选择window->preferences->android->build,获取sha1
5.提交后回到上一个android地图sdk页面选择相关下载,再点击自定义下载
6.选择定位功能,基础地图,检索功能,lbs云检索,计算工具后点击开发包,示例代码和类参考根据自己的实际情况进行下载
7.下载完成后解压如图
8.开始创建应用,注意创建时包名
9.创建好后,把刚才下载的libs目录下所有内容复制到项目libs文件夹中。
10.开始编写代码。activity_main.xml页面放入一个map控件。
activity_main.xml页面:
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity" > <com.baidu.mapapi.map.mapview android:id="@+id/mv_map" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </relativelayout>
11.main.xml作为菜单页面,增加几个模式选择。
main.xml页面:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/id_map_common" android:orderincategory="100" android:showasaction="never" android:title="普通地图"/> <item android:id="@+id/id_map_site" android:orderincategory="100" android:showasaction="never" android:title="卫星地图"/> <item android:id="@+id/id_map_traffic" android:orderincategory="100" android:showasaction="never" android:title="实时交通(off)"/> <item android:id="@+id/id_map_location" android:orderincategory="100" android:showasaction="never" android:title="我的位置"/> <item android:id="@+id/id_map_mode_common" android:orderincategory="100" android:showasaction="never" android:title="普通模式"/> <item android:id="@+id/id_map_mode_following" android:orderincategory="100" android:showasaction="never" android:title="跟随模式"/> <item android:id="@+id/id_map_mode_compass" android:orderincategory="100" android:showasaction="never" android:title="罗盘模式"/> </menu>
12.创建myorientationlistener.java页面用于在方向改变时进行获取。
myorientationlistener.java页面:
package com.imooc.baidumap; import android.content.context; import android.hardware.sensor; import android.hardware.sensorevent; import android.hardware.sensoreventlistener; import android.hardware.sensormanager; public class myorientationlistener implements sensoreventlistener { private sensormanager msensormanager; private context context; private sensor msensor;// 传感器 private float lastx; public myorientationlistener(context context) { this.context = context; } // 开启监听 @suppresswarnings("deprecation") public void start() { //获得系统服务 msensormanager=(sensormanager) context.getsystemservice(context.sensor_service); if(msensormanager!=null){ //获得方向传感器 msensor=msensormanager.getdefaultsensor(sensor.type_orientation); } if(msensor!=null){ msensormanager.registerlistener(this, msensor,sensormanager.sensor_delay_ui);//第三个参数为经度 } } // 结束监听 public void stop() { //停止定位 msensormanager.unregisterlistener(this); } // 经度发生改变时 @override public void onaccuracychanged(sensor arg0, int arg1) { } // 纬度发生改变时 @override public void onsensorchanged(sensorevent event) { //如果事件返回的类型是方向传感器 if(event.sensor.gettype()==sensor.type_orientation){ float x=event.values[sensormanager.data_x]; //如果变化大于一度 if(math.abs(x-lastx)>1.0){ //通知主界面进行回掉 if(monorientationlistener!=null){ monorientationlistener.onorientationchanged(x); } } lastx=x; } } private onorientationlistener monorientationlistener; public void setmonorientationlistener( onorientationlistener monorientationlistener) { this.monorientationlistener = monorientationlistener; } //回掉接口 public interface onorientationlistener{ void onorientationchanged(float x); } }
13.主页面mainactivity.java页面进行模式更改以及定位等。
mainactivity.java页面:
package com.imooc.baidumap; import com.baidu.location.bdlocation; import com.baidu.location.bdlocationlistener; import com.baidu.location.locationclient; import com.baidu.location.locationclientoption; import com.baidu.location.locationclientoption.locationmode; import com.baidu.mapapi.sdkinitializer; import com.baidu.mapapi.map.baidumap; import com.baidu.mapapi.map.bitmapdescriptor; import com.baidu.mapapi.map.bitmapdescriptorfactory; import com.baidu.mapapi.map.mylocationconfiguration; 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.mylocationdata; import com.baidu.mapapi.model.latlng; import com.imooc.baidumap.myorientationlistener.onorientationlistener; import android.os.bundle; import android.app.activity; import android.view.menu; import android.view.menuitem; import android.view.window; public class mainactivity extends activity { private mapview mv_map; private baidumap baidumap; // 定位相关 private locationclient mlocationclient; private mylocationlistener mlocationlistener; private boolean isfirstin = true; private double mlatitude; // 记录最新经纬度 private double mlongtitude; // 自定义定位图标 private bitmapdescriptor miconlocation; private myorientationlistener morientationlistener; private float mcurrentx; // 模式变量 private com.baidu.mapapi.map.mylocationconfiguration.locationmode mlocationmode; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // 在使用sdk各组件之前初始化context信息,传入applicationcontext // 注意该方法要再setcontentview方法之前实现 sdkinitializer.initialize(getapplicationcontext()); setcontentview(r.layout.activity_main); // 初始化控件 init(); // 初始化定位 initlocation(); } // 初始化控件 private void init() { mv_map = (mapview) findviewbyid(r.id.mv_map); baidumap = mv_map.getmap(); mapstatusupdate msu = mapstatusupdatefactory.zoomto(15.0f);// 设置地图放大比例 baidumap.setmapstatus(msu); } @override protected void onstart() { super.onstart(); baidumap.setmylocationenabled(true); if (!mlocationclient.isstarted()) { // 开启定位 mlocationclient.start(); // 开启方向传感器 morientationlistener.start(); } } @override protected void onstop() { super.onstop(); baidumap.setmylocationenabled(false); // 停止定位 mlocationclient.stop(); // 停止方向传感器 morientationlistener.stop(); } @override protected void onresume() { super.onresume(); // 在activity执行onresume时执行mmapview. onresume (),实现地图生命周期管理 mv_map.onresume(); } @override protected void onpause() { super.onpause(); // 在activity执行onpause时执行mmapview. onpause (),实现地图生命周期管理 mv_map.onpause(); } @override protected void ondestroy() { super.ondestroy(); // 在activity执行ondestroy时执行mmapview.ondestroy(),实现地图生命周期管理 mv_map.ondestroy(); } @override public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.main, menu); return super.oncreateoptionsmenu(menu); } // 点击菜单进行切换地图 @override public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case r.id.id_map_common: // 普通地图 baidumap.setmaptype(baidumap.map_type_normal); break; case r.id.id_map_site: // 卫星地图 baidumap.setmaptype(baidumap.map_type_satellite); break; case r.id.id_map_traffic: // 实时交通 if (baidumap.istrafficenabled()) { baidumap.settrafficenabled(false); item.settitle("实时交通(off)"); } else { baidumap.settrafficenabled(true); item.settitle("实时交通(on)"); } break; case r.id.id_map_location: centertomylocat(); break; case r.id.id_map_mode_common: mlocationmode = com.baidu.mapapi.map.mylocationconfiguration.locationmode.normal; break; case r.id.id_map_mode_following: mlocationmode = com.baidu.mapapi.map.mylocationconfiguration.locationmode.following; break; case r.id.id_map_mode_compass: mlocationmode = com.baidu.mapapi.map.mylocationconfiguration.locationmode.compass; break; default: break; } return super.onoptionsitemselected(item); } // 定位到我的位置 private void centertomylocat() { latlng latlng = new latlng(mlatitude, mlongtitude); mapstatusupdate msu = mapstatusupdatefactory.newlatlng(latlng); baidumap.animatemapstatus(msu); } private class mylocationlistener implements bdlocationlistener { @override public void onreceivelocation(bdlocation location) { mylocationdata data = new mylocationdata.builder()// .direction(mcurrentx)// .accuracy(location.getradius())// .latitude(location.getlatitude())// .longitude(location.getlongitude())// .build(); baidumap.setmylocationdata(data); // 更新位置 mlatitude = location.getlatitude(); mlongtitude = location.getlongitude(); // 判断是否第一次进入 if (isfirstin) { latlng latlng = new latlng(location.getlatitude(), location.getlongitude()); mapstatusupdate msu = mapstatusupdatefactory.newlatlng(latlng); baidumap.animatemapstatus(msu); isfirstin = false; } // 设置自定义图标 mylocationconfiguration config = new mylocationconfiguration( mlocationmode, true, miconlocation); baidumap.setmylocationconfigeration(config); } } // 初始化定位 private void initlocation() { mlocationmode = com.baidu.mapapi.map.mylocationconfiguration.locationmode.normal; // 默认模式 mlocationclient = new locationclient(this); mlocationlistener = new mylocationlistener(); mlocationclient.registerlocationlistener(mlocationlistener); locationclientoption option = new locationclientoption(); option.setcoortype("bd0911"); option.setisneedaddress(true); option.setopengps(true); option.setscanspan(1000);// 每个多少秒进行一次请求 mlocationclient.setlocoption(option); // 初始化图标 miconlocation = bitmapdescriptorfactory.fromresource(r.drawable.arrow); morientationlistener = new myorientationlistener(this); morientationlistener .setmonorientationlistener(new onorientationlistener() { @override public void onorientationchanged(float x) { mcurrentx = x; } }); } }
14.androidmanifest.xml页面配置权限及添加appkey。
androidmanifest.xml页面:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.imooc.baidumap" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="17" android:targetsdkversion="19" /> <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" /> <uses-permission android:name="android.permission.read_phone_state"/> <application android:allowbackup="true" 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="3kjzs5ym9txsm98v7bvjwztzwaoajsgp" /><!-- 创建应用的appkey --> <activity android:name="com.imooc.baidumap.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> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > <intent-filter> <action android:name="com.baidu.location.service_v2.2"> </action> </intent-filter> </service> </application> </manifest>
15.程序运行就可以显示目标效果了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 哪些食物适合高血压患者,哪些千万不能吃
下一篇: 详谈Java中的二进制及基本的位运算