欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BaiduMap SDK-多个个性化地图切换Demo

程序员文章站 2022-04-20 11:53:11
...

目录

1. assets中添加多个json文件

1.1 json文件项目结构

1.2 陆地(custom_config_land.json)

1.3水系(custom_config_water.json)

1.4 绿地(custom_config_green.json)

1.5 行政边界(custom_config_district.json)

1.6 旅游景区(custom_config_scenic.json)

1.7 机场(custom_config_airport.json)

2 代码编写

2.1 xm代码

2.2 Activity代码

2.2.1 初始化所有view

2.2.2 初始化数据和事件

2.2.3 个性化切换事件

2.2.4 刷新地图(设置个性化地图)

2.2.5 加载assets中的json

2.2.6 onDestroy()销毁地图组件和地图


1. assets中添加多个json文件

1.1 json文件项目结构

BaiduMap SDK-多个个性化地图切换Demo

1.2 陆地(custom_config_land.json)

[
  {
    "featureType": "land",
    "elementType": "geometry",
    "stylers": {
      "color": "#800000ff",
      "level": "12"
    }
  },
  {
    "featureType": "land",
    "elementType": "geometry",
    "stylers": {
      "color": "#800080ff"
    }
  }
]

1.3水系(custom_config_water.json)

[
  {
    "featureType": "water",
    "elementType": "geometry",
    "stylers": {
      "color": "#4169E1ff"
    }
  }
]

1.4 绿地(custom_config_green.json)

[
  {
    "featureType": "green",
    "elementType": "geometry",
    "stylers": {
      "color": "#008000ff"
    }
  }
]

1.5 行政边界(custom_config_district.json)

[
  {
    "featureType": "districtlabel",
    "elementType": "labels.text.stroke",
    "stylers": {
      "color": "#13171dff"
    }
  },
  {
    "featureType": "districtlabel",
    "elementType": "labels.text.fill",
    "stylers": {
      "color": "#4e5961ff"
    }
  }
]

1.6 旅游景区(custom_config_scenic.json)

[
  {
    "featureType": "scenicspotslabel",
    "elementType": "all",
    "stylers": {
      "color": "#800000ff"
    }
  },
  {
    "featureType": "scenicspots",
    "elementType": "all",
    "stylers": {
      "color": "#800000ff"
    }
  }
]

1.7 机场(custom_config_airport.json)

[
  {
    "featureType": "airportlabel",
    "elementType": "all",
    "stylers": {
      "color": "#800000ff"
    }
  },
  {
    "featureType": "airportlabel",
    "elementType": "geometry.fill",
    "stylers": {
      "color": "#800000ff"
    }
  },
  {
    "featureType": "airportlabel",
    "elementType": "labels.text.fill",
    "stylers": {
      "color": "#800000ff"
    }
  }
]

2 代码编写

2.1 xm代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rl_parent">
 <LinearLayout android:id="@+id/ll_mapView"
     android:layout_width="match_parent"
     android:layout_height="match_parent">

 </LinearLayout>
    <!--<com.baidu.mapapi.map.MapView-->
        <!--android:id="@+id/bmapView"-->
        <!--android:layout_width="fill_parent"-->
        <!--android:layout_height="fill_parent"-->
        <!--android:clickable="true" />-->

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="@android:color/darker_gray">

        <RadioGroup
            android:id="@+id/rb_custom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <RadioButton
                android:id="@+id/rb_open_custom"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/str_open_mapcustom" />

            <RadioButton
                android:id="@+id/rb_close_custom"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/str_close_mapcustom" />
        </RadioGroup>

        <Spinner android:id="@+id/spinner"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
         android:visibility="gone" ></Spinner>
    </LinearLayout>

    <TextView
        android:id="@+id/txt_coding"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@android:color/darker_gray"
        android:padding="5dp"
        android:textColor="@android:color/black"
        android:textSize="16dp" />

</RelativeLayout>

2.2 Activity代码

2.2.1 初始化所有view

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mapcustom);
        context = this;
        //初始化View
        initView();
        //初始化数据和事件
        initData();

    }
   //初始化View
    private void initView() {
        rb_custom = (RadioGroup) findViewById(R.id.rb_custom);
        txt_coding = (TextView) findViewById(R.id.txt_coding);
        rb_open_custom = (RadioButton) findViewById(R.id.rb_open_custom);
        rb_close_custom = (RadioButton) findViewById(R.id.rb_close_custom);
        spinner = (Spinner) findViewById(R.id.spinner);
        ll_mapView = (LinearLayout) findViewById(R.id.ll_mapView);
        mMapView = new MapView(context, new BaiduMapOptions());
        ll_mapView.addView(mMapView);
    }

2.2.2 初始化数据和事件

 private void initData() {
        List<String> spinnerList = new ArrayList<String>();
        spinnerList.add("个性化");
        spinnerList.add("陆地");
        spinnerList.add("水系");
        spinnerList.add("绿地");
        spinnerList.add("行政区边界");
        spinnerList.add("景区");
        spinnerList.add("机场");
        spinnerList.add("地铁");
        spinnerList.add("教育和医疗");
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, spinnerList);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(new SpinnerOnSelect());
        rb_custom.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                switch (i) {
                    case R.id.rb_open_custom://显示个性地图
                        MapView.setMapCustomEnable(true);
                        spinner.setVisibility(View.VISIBLE);
                        break;
                    case R.id.rb_close_custom://关闭个性地图
                        MapView.setMapCustomEnable(false);
                        spinner.setVisibility(View.INVISIBLE);
                        break;
                }
            }
        });
    }

2.2.3 个性化切换事件

 private class SpinnerOnSelect implements AdapterView.OnItemSelectedListener {

        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {

            switch (i) {
                case 0://全部
                    refreshMap("custom_config_dark.json");
                    break;
                case 1://陆地
                    refreshMap("custom_config_land.json");
                    break;
                case 2://水系
                    refreshMap("custom_config_water.json");
                    break;
                case 3://绿地
                    refreshMap("custom_config_green.json");
                    break;
                case 4://行政区边界
                    refreshMap("custom_config_district.json");
                    break;
                case 5://景点
                    refreshMap("custom_config_scenic.json");
                    break;
                case 6://机场
                    refreshMap("custom_config_airport.json");
                    break;
               
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    }

2.2.4 刷新地图(设置个性化地图)

  /**
     * 设置个性化地图
     */

    private void refreshMap(String path) {
        MapView.setMapCustomEnable(false);
        ll_mapView.removeView(mMapView);
        mMapView.onDestroy();

        setMapCustomFile(context, path);
        mMapView = new MapView(context, new BaiduMapOptions());
        ll_mapView.addView(mMapView);
        MapView.setMapCustomEnable(true);
    }

2.2.5 加载assets中的json

// 设置个性化地图config文件路径
    private void setMapCustomFile(Context context, String PATH) {
        FileOutputStream out = null;
        InputStream inputStream = null;
        String moduleName = null;
        try {
            inputStream = context.getAssets()
                    .open("customConfigdir/" + PATH);
            byte[] b = new byte[inputStream.available()];
            inputStream.read(b);

            moduleName = context.getFilesDir().getAbsolutePath();
            File f = new File(moduleName + "/" + PATH);
            if (f.exists()) {
                f.delete();
            }
            f.createNewFile();
            out = new FileOutputStream(f);
            out.write(b);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        MapView.setCustomMapStylePath(moduleName + "/" + PATH);
    }

2.2.6 onDestroy()销毁地图组件和地图

onDestory()如果直销毁MapView,不销毁地图组件或造成崩溃;

 @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        MapView.setMapCustomEnable(false);
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }