本文實(shí)例為大家分享了Android百度地圖之方向感應(yīng)和模式更改,供大家參考,具體內(nèi)容如下
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了白朗免費(fèi)建站歡迎大家使用!
目標(biāo)效果:
菜單中設(shè)置幾種模式,點(diǎn)擊可查看不同的地圖形式,這里隨便截幾張圖。
1.首先要去百度地圖網(wǎng)站 http://lbsyun.baidu.com/
2.注冊(cè)賬號(hào)后,點(diǎn)擊開發(fā)->Android地圖SDK->獲取密鑰,進(jìn)入后顯示如下頁面。
3.創(chuàng)建應(yīng)用
4.打開eclipse,選擇Window->Preferences->Android->Build,獲取SHA1
5.提交后回到上一個(gè)Android地圖SDK頁面選擇相關(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頁面放入一個(gè)map控件。
activity_main.xml頁面:
11.main.xml作為菜單頁面,增加幾個(gè)模式選擇。
main.xml頁面:
12.創(chuàng)建MyOrientationListener.java頁面用于在方向改變時(shí)進(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);//第三個(gè)參數(shù)為經(jīng)度 } } // 結(jié)束監(jiān)聽 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.主頁面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方法之前實(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頁面配置權(quán)限及添加AppKey。
Androidmanifest.xml頁面:
<?xml version="1.0" encoding="utf-8"?>
15.程序運(yùn)行就可以顯示目標(biāo)效果了。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。