溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android百度地圖之方向感應(yīng)和模式更改

發(fā)布時間:2020-09-03 17:53:24 來源:腳本之家 閱讀:166 作者:Vivinia_Vivinia 欄目:移動開發(fā)

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

目標(biāo)效果:

Android百度地圖之方向感應(yīng)和模式更改

菜單中設(shè)置幾種模式,點擊可查看不同的地圖形式,這里隨便截幾張圖。

1.首先要去百度地圖網(wǎng)站 http://lbsyun.baidu.com/

2.注冊賬號后,點擊開發(fā)->Android地圖SDK->獲取密鑰,進(jìn)入后顯示如下頁面。

Android百度地圖之方向感應(yīng)和模式更改

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

Android百度地圖之方向感應(yīng)和模式更改

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

Android百度地圖之方向感應(yīng)和模式更改

5.提交后回到上一個Android地圖SDK頁面選擇相關(guān)下載,再點擊自定義下載

6.選擇定位功能,基礎(chǔ)地圖,檢索功能,LBS云檢索,計算工具后點擊開發(fā)包,示例代碼和類參考根據(jù)自己的實際情況進(jìn)行下載

7.下載完成后解壓如圖

Android百度地圖之方向感應(yīng)和模式更改

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

Android百度地圖之方向感應(yīng)和模式更改

9.創(chuàng)建好后,把剛才下載的libs目錄下所有內(nèi)容復(fù)制到項目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="衛(wèi)星地圖"/>
  <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.創(chuàng)建MyOrientationListener.java頁面用于在方向改變時進(jìn)行獲取。

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;
 }
 
 // 開啟監(jiān)聽
 @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);//第三個參數(shù)為經(jīng)度
 }
 }
 
 // 結(jié)束監(jiān)聽
 public void stop() {
 //停止定位
 mSensorManager.unregisterListener(this);
 }
 
 // 經(jīng)度發(fā)生改變時
 @Override
 public void onAccuracyChanged(Sensor arg0, int arg1) {
 
 }
 
 // 緯度發(fā)生改變時
 @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.主頁面MainActivity.java頁面進(jìn)行模式更改以及定位等。

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;
 
 // 定位相關(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方法之前實現(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時執(zhí)行mMapView. onResume (),實現(xiàn)地圖生命周期管理
 mv_map.onResume();
 }
 
 @Override
 protected void onPause() {
 super.onPause();
 // 在activity執(zhí)行onPause時執(zhí)行mMapView. onPause (),實現(xiàn)地圖生命周期管理
 mv_map.onPause();
 
 }
 
 @Override
 protected void onDestroy() {
 super.onDestroy();
 // 在activity執(zhí)行onDestroy時執(zhí)行mMapView.onDestroy(),實現(xiàn)地圖生命周期管理
 mv_map.onDestroy();
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 getMenuInflater().inflate(R.menu.main, menu);
 return super.onCreateOptionsMenu(menu);
 }
 
 // 點擊菜單進(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: // 實時交通
  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();
  // 判斷是否第一次進(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);// 每個多少秒進(jìn)行一次請求
 
 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頁面配置權(quán)限及添加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" /><!-- 創(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.程序運行就可以顯示目標(biāo)效果了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI