Android百度地圖之方向感應(yīng)和模式更改
本文實(shí)例為大家分享了Android百度地圖之方向感應(yīng)和模式更改,供大家參考,具體內(nèi)容如下
目標(biāo)效果:

菜單中設(shè)置幾種模式,點(diǎn)擊可查看不同的地圖形式,這里隨便截幾張圖。
1.首先要去百度地圖網(wǎng)站 http://lbsyun.baidu.com/
2.注冊(cè)賬號(hào)后,點(diǎn)擊開發(fā)->Android地圖SDK->獲取密鑰,進(jìn)入后顯示如下頁(yè)面。

3.創(chuàng)建應(yīng)用

4.打開eclipse,選擇Window->Preferences->Android->Build,獲取SHA1

5.提交后回到上一個(gè)Android地圖SDK頁(yè)面選擇相關(guān)下載,再點(diǎn)擊自定義下載
6.選擇定位功能,基礎(chǔ)地圖,檢索功能,LBS云檢索,計(jì)算工具后點(diǎn)擊開發(fā)包,示例代碼和類參考根據(jù)自己的實(shí)際情況進(jìn)行下載
7.下載完成后解壓如圖

8.開始創(chuàng)建應(yīng)用,注意創(chuàng)建時(shí)包名

9.創(chuàng)建好后,把剛才下載的libs目錄下所有內(nèi)容復(fù)制到項(xiàng)目libs文件夾中。
10.開始編寫代碼。activity_main.xml頁(yè)面放入一個(gè)map控件。
activity_main.xml頁(yè)面:
<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作為菜單頁(yè)面,增加幾個(gè)模式選擇。
main.xml頁(yè)面:
<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="衛(wèi)星地圖"/>
<item
android:id="@+id/id_map_traffic"
android:orderInCategory="100"
android:showAsAction="never"
android:title="實(shí)時(shí)交通(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.創(chuàng)建MyOrientationListener.java頁(yè)面用于在方向改變時(shí)進(jìn)行獲取。
MyOrientationListener.java頁(yè)面:
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;
}
// 開啟監(jiān)聽(tīng)
@SuppressWarnings("deprecation")
public void start() {
//獲得系統(tǒng)服務(wù)
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);//第三個(gè)參數(shù)為經(jīng)度
}
}
// 結(jié)束監(jiān)聽(tīng)
public void stop() {
//停止定位
mSensorManager.unregisterListener(this);
}
// 經(jīng)度發(fā)生改變時(shí)
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
// 緯度發(fā)生改變時(shí)
@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){
//通知主界面進(jìn)行回掉
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.主頁(yè)面MainActivity.java頁(yè)面進(jìn)行模式更改以及定位等。
MainActivity.java頁(yè)面:
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;
// 定位相關(guān)
private LocationClient mLocationClient;
private MyLocationListener mLocationListener;
private boolean isFirstIn = true;
private double mLatitude; // 記錄最新經(jīng)緯度
private double mLongtitude;
// 自定義定位圖標(biāo)
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方法之前實(shí)現(xiàn)
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);// 設(shè)置地圖放大比例
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執(zhí)行onResume時(shí)執(zhí)行mMapView. onResume (),實(shí)現(xiàn)地圖生命周期管理
mv_map.onResume();
}
@Override
protected void onPause() {
super.onPause();
// 在activity執(zhí)行onPause時(shí)執(zhí)行mMapView. onPause (),實(shí)現(xiàn)地圖生命周期管理
mv_map.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 在activity執(zhí)行onDestroy時(shí)執(zhí)行mMapView.onDestroy(),實(shí)現(xiàn)地圖生命周期管理
mv_map.onDestroy();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
// 點(diǎn)擊菜單進(jìn)行切換地圖
@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: // 衛(wèi)星地圖
baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
case R.id.id_map_traffic: // 實(shí)時(shí)交通
if (baiduMap.isTrafficEnabled()) {
baiduMap.setTrafficEnabled(false);
item.setTitle("實(shí)時(shí)交通(off)");
} else {
baiduMap.setTrafficEnabled(true);
item.setTitle("實(shí)時(shí)交通(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();
// 判斷是否第一次進(jìn)入
if (isFirstIn) {
LatLng latLng = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
baiduMap.animateMapStatus(msu);
isFirstIn = false;
}
// 設(shè)置自定義圖標(biāo)
MyLocationConfiguration config = new MyLocationConfiguration(
mLocationMode, true, mIconLocation);
baiduMap.setMyLocationConfigeration(config);
}
}
// 初始化定位
private void initLocation() {
mLocationMode = com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.NORMAL; // 默認(rèn)模式
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);// 每個(gè)多少秒進(jìn)行一次請(qǐng)求
mLocationClient.setLocOption(option);
// 初始化圖標(biāo)
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頁(yè)面配置權(quán)限及添加AppKey。
Androidmanifest.xml頁(yè)面:
<?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" /><!-- 創(chuàng)建應(yīng)用的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.程序運(yùn)行就可以顯示目標(biāo)效果了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android實(shí)現(xiàn)百度地圖自定義彈出窗口功能
- Android百度地圖定位后獲取周邊位置的實(shí)現(xiàn)代碼
- Android下如何使用百度地圖sdk
- 基于Android實(shí)現(xiàn)百度地圖定位過(guò)程詳解
- Android百度地圖實(shí)現(xiàn)搜索和定位及自定義圖標(biāo)繪制并點(diǎn)擊時(shí)彈出泡泡
- Android 百度地圖POI搜索功能實(shí)例代碼
- Android百度定位導(dǎo)航之基于百度地圖移動(dòng)獲取位置和自動(dòng)定位
- Android 調(diào)用百度地圖API示例
- Android百度地圖自定義公交路線導(dǎo)航
- Android SDK 百度地圖通過(guò)poi城市內(nèi)檢索簡(jiǎn)介接口的使用
相關(guān)文章
Android實(shí)現(xiàn)標(biāo)題顯示隱藏功能
這篇文章主要介紹了Android實(shí)現(xiàn)標(biāo)題顯示隱藏功能2016-02-02
Android ListView 單條刷新方法實(shí)踐及原理解析
這篇文章主要介紹了Android ListView 單條刷新方法實(shí)踐及原理解析的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
EditText實(shí)現(xiàn)輸入限制和校驗(yàn)功能實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹EditText實(shí)現(xiàn)輸入限制和校驗(yàn)功能,感興趣的朋友參考下吧2017-08-08
Android中MPAndroidChart自定義繪制最高點(diǎn)標(biāo)識(shí)的方法
目前在做一款軟件,要求在展示走勢(shì)圖的時(shí)候?qū)ψ罡唿c(diǎn)進(jìn)行自定義繪制,下面這篇文章主要給大家介紹了關(guān)于Android中MPAndroidChart自定義繪制最高點(diǎn)標(biāo)識(shí)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
簡(jiǎn)單談?wù)刟ndroid studio 的單元測(cè)試
昨天在完善項(xiàng)目的時(shí)候,需要進(jìn)行單元測(cè)試,在Eclipse環(huán)境中進(jìn)行是很簡(jiǎn)單的,但是在Android Studio環(huán)境中進(jìn)行單元測(cè)試,在國(guó)內(nèi)找了很多資料,大都是人云亦云,本文發(fā)布出來(lái)供大家學(xué)習(xí)參考。2016-08-08
Android自定義View onDraw()方法會(huì)調(diào)用兩次的問(wèn)題解決
這篇文章主要介紹了Android自定義View onDraw()方法會(huì)調(diào)用兩次的問(wèn)題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
Flutter 底部彈窗如何實(shí)現(xiàn)多項(xiàng)選擇
在Flutter中提供了一個(gè)showModelBottomSheet方法用于彈出底部彈窗,本篇基于這個(gè)方法介紹實(shí)現(xiàn)底部彈窗多選的思路和方式。2021-06-06

