1、添加室内图开关的按钮
在布局文件中添加如下代码:
<Button
android:id="@+id/isIndoor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:text="室内图开关"
tools:layout_editor_absoluteX="301dp"
tools:layout_editor_absoluteY="26dp"
/>
默认开启室内图
mBaiduMap.setIndoorEnable(true);
设置按钮的点击事件
isIndoorBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isIndoor) {
EnableIndoorMap();
} else {
DisableIndoorMap();
}
isIndoor = !isIndoor;
}
});
EnableIndoorMap()方法
private void EnableIndoorMap() {
mbaiduMap.setIndoorEnable(true);
isIndoorBtn.setText("关闭室内图");
Toast.makeText(MainActivity.this, "室内图已打开", Toast.LENGTH_SHORT).show();
}
DisEnableIndoorMap() 方法
private void DisableIndoorMap() {
if (null != mIndoorRoutelineOverlay) {
mIndoorRoutelineOverlay.removeFromMap();
mIndoorRoutelineOverlay = null;
}
mbaiduMap.clear();
mbaiduMap.setIndoorEnable(false);
isIndoorBtn.setText("打开室内图");
Toast.makeText(MainActivity.this, "室内图已关闭", Toast.LENGTH_SHORT).show();
}
注:IndoorRoutelineOverlay类相关的代码在官方的demo中有,直接复制过来即可
设置监听事件来监听进入和移出室内图
mbaiduMap.setOnBaseIndoorMapListener(new BaiduMap.OnBaseIndoorMapListener() {
@Override
public void onBaseIndoorMapMode(boolean b, MapBaseIndoorMapInfo mapBaseIndoorMapInfo) {
if (b == false || mapBaseIndoorMapInfo == null) {
stripListView.setVisibility(View.INVISIBLE);
return;
}
mFloorListAdapter.setmFloorList( mapBaseIndoorMapInfo.getFloors());
stripListView.setVisibility(View.VISIBLE);
stripListView.setStripAdapter(mFloorListAdapter);
mMapBaseIndoorMapInfo = mapBaseIndoorMapInfo;
}
});
添加楼层信息
stripListView = new StripListView(this);
layout.addView(stripListView);
setContentView(layout);
mFloorListAdapter = new BaseStripAdapter(MainActivity.this);
实现楼层间地图切换,展示不同楼层的室内图
stripListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (mMapBaseIndoorMapInfo == null) {
return;
}
// 切换楼层信息
//strID 通过 mMapBaseIndoorMapInfo.getID()方法获得
String floor = (String) mFloorListAdapter.getItem(position);
mbaiduMap.switchBaseIndoorMapFloor(floor, mMapBaseIndoorMapInfo.getID());
mFloorListAdapter.setSelectedPostion(position);
mFloorListAdapter.notifyDataSetInvalidated();
}
});
然后运行工程,室内图已经出现了,如图:
并且可以成功切换楼层
2、方向传感器的实现
新建MyOrientationListener用来负责定位图标与方向传感器相结合
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);
}
// 经度发生改变时
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
// 纬度发生改变时
@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){
//通知主界面进行回掉
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);
}
}
初始化方向传感器
private void initOritationListener()
{
myOrientationListener = new MyOrientationListener(
getApplicationContext());
myOrientationListener
.setmOnOrientationListener(new MyOrientationListener.OnOrientationListener()
{
@Override
public void onOrientationChanged(float x)
{
mCurrentX = (int) x;
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(mCurrentAccracy)
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(mCurrentX)
.latitude(mCurrentLantitude)
.longitude(mCurrentLongitude).build();
// 设置定位数据
mbaiduMap.setMyLocationData(locData);
// 设置自定义图标
// BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
// .fromResource(R.mipmap.navi_map_gps_locked);
MyLocationConfiguration config = new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.NORMAL, true, null);
mbaiduMap.setMyLocationConfigeration(config);
}
});
}
重载Onstart()和OnStop()方法
@Override
protected void onStart() {
super.onStart();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
//开启定位的允许
mbaiduMap.setMyLocationEnabled(true);
if (!mLocationClient.isStarted()) {
mLocationClient.start();
//开启方向传感器
myOrientationListener.start();
}
}
@Override
protected void onStop() {
super.onStop();
//关闭定位
mbaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
//停止方向传感器
myOrientationListener.stop();
//client.disconnect();
}
最终效果如图: