使用百度地图(下)

命运如同手中的掌纹,无论多曲折,终掌握在自己手中。


本讲内容:使用百度地图


示例一:自定义定位图标并使用方向传感器

1、自定义定位图标

使用MyLocationConfigeration配置类来自定义定位图标,MyLocationConfigeration 构造器有3个参数:

第一个参数 mode:定位图层显示方式, 默认为 LocationMode.NORMAL 普通态

第二个参数 enableDirection:是否允许显示方向信息

第三个参数 customMarker:设置用户自定义定位图标,可以为 null
注意:要导入import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode 否则会报错。

代码如下 :

MyLocationConfiguration config=new MyLocationConfiguration(LocationMode.NORMAL, true, mIconLocation);
mBaiduMap.setMyLocationConfigeration(config);

2、使用方向传感器

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor magneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(sensorListener, magneticSensor,SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(sensorListener, accelerometerSensor,SensorManager.SENSOR_DELAY_FASTEST);


  
下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {
	……

	// 自定义定位图标
	private BitmapDescriptor mIconLocation;
	private SensorManager mSensorManager;//传感器
	private float mCurrentZ;//Z轴

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
		// 注意该方法要再setContentView方法之前实现
		SDKInitializer.initialize(getApplicationContext());
		setContentView(R.layout.activity_main);
		this.context = this;
		initView();
		initLocation();
		initSensor();
	}

	……
	/**
	 * 初始化定位
	 */
	private void initLocation() {
		mLocationClient = new LocationClient(getApplicationContext());
		mLocationListener = new MyLocationListener();
		mLocationClient.registerLocationListener(mLocationListener);

		LocationClientOption option = new LocationClientOption();
		option.setCoorType("bd09ll");// 设置返回的坐标类型(设置返回的定位结果是百度经纬度,默认值gcj02)
		option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
		option.setOpenGps(true);// 是否打开GPS
		option.setScanSpan(1000);// 设置发起定位请求的间隔时间为1000ms   onReceiveLocation方法每隔1秒执行一次(要大于1秒)
		mLocationClient.setLocOption(option);

		// 初始化图标
		mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.map_gps_logo);
	}

	/**
	 * 初始化传感器
	 */
	private void initSensor() {
		mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		Sensor magneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
		Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		mSensorManager.registerListener(sensorListener, magneticSensor,SensorManager.SENSOR_DELAY_FASTEST);
		mSensorManager.registerListener(sensorListener, accelerometerSensor,SensorManager.SENSOR_DELAY_FASTEST);
	}

	……

	/**
	 * 定位接口 onReceiveLocation():接收异步返回的定位结果
	 */
	private class MyLocationListener implements BDLocationListener {

		public void onReceiveLocation(BDLocation location) {
			if (location == null) {
				return;
			}
			
			System.out.println(mCurrentZ);
			// 当参数比较多时,习惯在类里面建立一个Builder内部类来初始化参数
			MyLocationData data = new MyLocationData.Builder()//
					.direction(mCurrentZ)//
					.accuracy(location.getRadius())//
					.latitude(location.getLatitude())//
					.longitude(location.getLongitude())//
					.build();
			mBaiduMap.setMyLocationData(data);

			// 设置自定义图标
			MyLocationConfiguration config = new MyLocationConfiguration(
					LocationMode.NORMAL, true, mIconLocation);
			mBaiduMap.setMyLocationConfigeration(config);

			// 更新经纬度
			mLatitude = location.getLatitude();
			mLongtitude = location.getLongitude();

			// 使每次发起定位请求不会执行
			if (isFirstIn) {
				centerToMyLocation();
				isFirstIn = false;
				Toast.makeText(context, location.getAddrStr(),Toast.LENGTH_LONG).show();
			}
		}
	}

	/**
	 * 方向传感器
	 */
	private SensorEventListener sensorListener = new SensorEventListener() {

		float[] accelerometerValues = new float[3];
		float[] magneticValues = new float[3];
		private float lastDegreeZ;

		public void onSensorChanged(SensorEvent event) {
			//判断当前是加速度传感器还是地磁传感器  
            if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){  
                //注意赋值时要调用clone()方法  
                accelerometerValues=event.values.clone();  
            }else if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){  
                magneticValues=event.values.clone();  
            }  
            float[] R=new float[9];  
            float[] values=new float[3];  
            SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);  
            SensorManager.getOrientation(R, values);  
            
            mCurrentZ=(float) Math.toDegrees(values[0]); 
            if(Math.abs(mCurrentZ-lastDegreeZ)>1){
            	lastDegreeZ=mCurrentZ;  
            }
		}

		public void onAccuracyChanged(Sensor sensor, int accuracy) {

		}
	};

	……

	protected void onDestroy() {
		super.onDestroy();
		// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
		mMapView.onDestroy();
		if(mSensorManager!=null){
			mSensorManager.unregisterListener(sensorListener); //关闭传感器
		}
	}
}


示例二:三种模式切换

  

    <item
        android:id="@+id/id_map_mode_common"
        android:showAsAction="never"
        android:title="普通模式"/>
    <item
        android:id="@+id/id_map_mode_following"
        android:showAsAction="never"
        android:title="跟随模式"/>
    <item
        android:id="@+id/id_map_mode_compass"
        android:showAsAction="never"
        android:title="罗盘模式"/>
在相应的菜单添加点击事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值