百度地图3.7.1和传感器的应用
主要思路就是通过监听方向传感器,
然后接口回掉这个改变好之后的值,
在位置监听里设置这个传感器的值就可以了。
package com.map.ditu; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; public class MySensorEventListener implements SensorEventListener { private Context mContext; private SensorManager mManager; private Sensor mSensor; // 最后的X坐标 private float lastX; public MySensorEventListener(Context mContext) { this.mContext = mContext; } @SuppressWarnings("deprecation") @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { //改变的x值 float x = event.values[SensorManager.DATA_X]; //为了不使ui刷新过快进行判断 if (Math.abs(x - lastX) > 1.0) { if (listener != null) { listener.onSenSorChangListener(x); } } lastX = x; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } @SuppressWarnings("deprecation") public void start() { //获得传感器的管理者 mManager = (SensorManager) mContext .getSystemService(Context.SENSOR_SERVICE); // 获得方向传感器 if (mManager != null) { mSensor = mManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); } if (mSensor != null) { // 注册监听 mManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_UI); } } public void stop() { // 取消注册 mManager.unregisterListener(this); } private OnSensorChangeListener listener; public void setListener(OnSensorChangeListener listener) { this.listener = listener; } public interface OnSensorChangeListener { public void onSenSorChangListener(float x); } }
使用的时候也和位置监听一样,要和activity一起联动。
package com.map.ditu; 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.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.map.ditu.MySensorEventListener.OnSensorChangeListener; import android.view.Menu; import android.view.MenuItem; import android.view.Window; import android.widget.Toast; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { private MapView map; private BaiduMap mBaidu; //位置 private LocationClient mLocationClient; //位置接口 private BDLocationListener myListener; //判断是不是第一次进入 private boolean isFirst = true; //记录经纬度 private double jing = 0; private double wei = 0; //自定义我的位置圆点 private BitmapDescriptor mIconLocation; private float currentX; //位置传感器 private MySensorEventListener listener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去除标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); //初始化百度地图 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); initView(); initLocation(); } private void initLocation() { mLocationClient = new LocationClient(getApplicationContext()); myListener = new MyLocationListener(); //注册监听 mLocationClient.registerLocationListener(myListener); //设置LocationClient LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationMode.Hight_Accuracy);// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系 int span = 1000; option.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true);// 可选,默认false,设置是否使用gps option.setLocationNotify(true);// 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setIsNeedLocationDescribe(true);// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIgnoreKillProcess(false);// 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 option.SetIgnoreCacheException(false);// 可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false);// 可选,默认false,设置是否需要过滤gps仿真结果,默认需要 option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 mLocationClient.setLocOption(option); //初始化图标 mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked); listener = new MySensorEventListener(this); listener.setListener(new OnSensorChangeListener() { @Override public void onSenSorChangListener(float x) { currentX = x; } }); } private void initView() { map = (MapView) findViewById(R.id.map); //把视图对象转成BaiduMap mBaidu = map.getMap(); // 设置地图初始的位置 // MapStatusUpdate msu = MapStatusUpdateFactory.zoomBy(50.0f); // mBaidu.setMapStatus(msu); } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case R.id.nomore: mBaidu.setMapType(BaiduMap.MAP_TYPE_NORMAL);// 设置普通地地图 break; case R.id.weixing: mBaidu.setMapType(BaiduMap.MAP_TYPE_SATELLITE);// 设置卫星图 break; case R.id.ontime: if (mBaidu.isTrafficEnabled()) { mBaidu.setTrafficEnabled(false); item.setTitle("实时交通---打开"); } else { mBaidu.setTrafficEnabled(true); item.setTitle("实时交通---关闭"); } break; case R.id.location: LatLng la = new LatLng(jing, wei); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(la); mBaidu.animateMapStatus(msu); break; default: break; } return true; } public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { //设置我当前位置的数据 MyLocationData data = new MyLocationData.Builder()// .accuracy(location.getRadius())// .direction(currentX)// .latitude(location.getLatitude())// .longitude(location.getLongitude())// .build(); mBaidu.setMyLocationData(data); //设置自定义的图片 MyLocationConfiguration config = new MyLocationConfiguration(com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.FOLLOWING , true,mIconLocation); mBaidu.setMyLocationConfigeration(config); //如果是第一次进入,会显示当前位置 if (isFirst) { jing = location.getLatitude(); wei = location.getLongitude(); LatLng la = new LatLng(jing, wei); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(la); mBaidu.animateMapStatus(msu); isFirst = false; Toast.makeText(MainActivity.this,location.getAddrStr(),0).show(); } } } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); // 开启定位能功能 mBaidu.setMyLocationEnabled(true); if (!mLocationClient.isStarted()) //开启定位 mLocationClient.start(); if(listener!=null){ listener.start(); } } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); // 停止定位功能 mBaidu.setMyLocationEnabled(false); //停止定位 mLocationClient.stop(); listener.stop(); } }