Android-百度地圖之方向感應和模式更改

來源:互聯網
上載者:User

標籤:

目標效果:

   

菜單中設定幾種模式,點擊可查看不同的地圖形式,這裡隨便截幾張圖。


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);}// 經度發生改變時@Overridepublic void onAccuracyChanged(Sensor arg0, int arg1) {}// 緯度發生改變時@Overridepublic 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;@Overrideprotected 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);}@Overrideprotected void onStart() {super.onStart();baiduMap.setMyLocationEnabled(true);if (!mLocationClient.isStarted()) {// 開啟定位mLocationClient.start();// 開啟方向感應器mOrientationListener.start();}}@Overrideprotected void onStop() {super.onStop();baiduMap.setMyLocationEnabled(false);// 停止定位mLocationClient.stop();// 停止方向感應器mOrientationListener.stop();}@Overrideprotected void onResume() {super.onResume();// 在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理mv_map.onResume();}@Overrideprotected void onPause() {super.onPause();// 在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理mv_map.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();// 在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理mv_map.onDestroy();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return super.onCreateOptionsMenu(menu);}// 點擊菜單進行切換地圖@Overridepublic 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 {@Overridepublic 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() {@Overridepublic 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.程式運行就可以顯示目標效果了。





Android-百度地圖之方向感應和模式更改

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.