百度地图之覆盖物

  • Post author:
  • Post category:其他


今天熟悉了一下百度地图有关覆盖物的知识,首先,大家来看一下做出来的效果:

这里写图片描述

我们来看代码

一、布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/clear_overlay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="清空数据" />

        <Button
            android:id="@+id/reset_overlay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="重置" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <SeekBar
            android:id="@+id/seekbar_overlay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1" />

        <CheckBox
            android:id="@+id/checkbox_overlay"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:checked="true"
            android:text="Mark添加动画" />
    </LinearLayout>

    <com.baidu.mapapi.map.MapView
        android:id="@+id/mapView_overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />
</LinearLayout>

二、我们来看一下在onCreate()方法里调用的方法,先大致形成一个思路

    @Bind(R.id.clear_overlay)
    Button clear_overlay;
    @Bind(R.id.reset_overlay)
    Button reset_overlay;
    @Bind(R.id.seekbar_overlay)
    SeekBar seekbar_overlay;
    @Bind(R.id.checkbox_overlay)
    CheckBox checkbox_overlay;
    @Bind(R.id.mapView_overlay)
    MapView mapView_overlay;
    private BaiduMap baidumap;
    private Marker mMarkerA;
    private Marker mMarkerB;
    private Marker mMarkerC;
    private Marker mMarkerD;
    BitmapDescriptor bdA;
    BitmapDescriptor bdB;
    BitmapDescriptor bdC;
    BitmapDescriptor bdD;
    BitmapDescriptor db;
    BitmapDescriptor bdGround;
    private InfoWindow infoWindow;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_baidu_over);
        ButterKnife.bind(this);
        initView();//控件的初始化
        initBitmapDescriptor();//初始化全局bitmap的信息
        initOverlay(); //覆盖物的初始化
        setBaiduMarkListener();//设置当点击覆盖物时做的操作
    }

三、initView()方法,实现控件的初始化

 public void initView() {
        baidumap = mapView_overlay.getMap();
        MapStatusUpdate mapStatus = MapStatusUpdateFactory.zoomTo(14.0f);
        baidumap.setMapStatus(mapStatus);
        seekbar_overlay.setOnSeekBarChangeListener(new SeekBarListner());
        clear_overlay.setOnClickListener(this);
        reset_overlay.setOnClickListener(this);
    }

四、initBitmapDescriptor()方法,初始化全局bitmap(标注物)的信息

//初始化全局bitmap的信息,及时recycle
    public void initBitmapDescriptor() {
        bdA = BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka);
        bdB = BitmapDescriptorFactory.fromResource(R.mipmap.icon_markb);
        bdC = BitmapDescriptorFactory.fromResource(R.mipmap.icon_markc);
        bdD = BitmapDescriptorFactory.fromResource(R.mipmap.icon_markd);
        bdGround = BitmapDescriptorFactory.fromResource(R.mipmap.ground_overlay);
        db = BitmapDescriptorFactory.fromResource(R.mipmap.icon_gcoding);
    }

五、initOverlay() 方法,初始化覆盖物的位置信息,设置覆盖物的移动监听OnMarkerDragListener();

 //覆盖物的初始化
    public void initOverlay() {
        LatLng llA = new LatLng(39.963175, 116.400244);
        LatLng llB = new LatLng(39.942821, 116.369199);
        LatLng llC = new LatLng(39.939723, 116.425541);
        LatLng llD = new LatLng(39.906965, 116.401394);

        MarkerOptions ooA = new MarkerOptions()
                .position(llA).//设置覆盖物的位置坐标
                        icon(bdA).//设置Marker覆盖物的图标
                        zIndex(9).
                        draggable(true);//覆盖物是否可以拖拽
        if (checkbox_overlay.isChecked()) {
            //调用动画
            ooA.animateType(MarkerOptions.MarkerAnimateType.drop);
        }
        mMarkerA = (Marker) (baidumap.addOverlay(ooA));

        MarkerOptions ooB = new MarkerOptions().position(llB).icon(bdB).zIndex(5);
        if (checkbox_overlay.isChecked()) {
            ooB.animateType(MarkerOptions.MarkerAnimateType.drop);
        }
        mMarkerB = (Marker) baidumap.addOverlay(ooB);

        MarkerOptions ooC = new MarkerOptions().position(llC).icon(bdC)
                .perspective(false)//设置是否开启 Marker 覆盖物近大远小效果,默认开启
                .anchor(0.5f, 0.5f)//设置 Marker 覆盖物的锚点比例,默认(0.5f, 1.0f)水平居中,垂直下对齐
                .rotate(30)//设置旋转角度
                .zIndex(7);
        if (checkbox_overlay.isChecked()) {
            ooC.animateType(MarkerOptions.MarkerAnimateType.grow);
        }
        mMarkerC = (Marker) baidumap.addOverlay(ooC);

        ArrayList<BitmapDescriptor> list = new ArrayList<>();
        list.add(bdA);
        list.add(bdB);
        list.add(bdC);

        MarkerOptions ooD = new MarkerOptions().position(llD).icons(list)
                .zIndex(0).period(10);
        if (checkbox_overlay.isChecked()) {
            // 生长动画
            ooD.animateType(MarkerOptions.MarkerAnimateType.grow);
        }
        mMarkerD = (Marker) (baidumap.addOverlay(ooD));

        //增加周围的覆盖物
        LatLng southwest = new LatLng(39.92235, 116.380338);
        LatLng northeast = new LatLng(39.947246, 116.414977);
        LatLngBounds bounds = new LatLngBounds.Builder().include(southwest).include(northeast).build();
        OverlayOptions ooGround = new GroundOverlayOptions()
                .positionFromBounds(bounds).image(bdGround).transparency(0.8f);
        baidumap.addOverlay(ooGround);
        //MapStatusUpdate描述地图状态将要发生的变化
        MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(bounds.getCenter());
        baidumap.setMapStatus(u);
        baidumap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() {
            @Override
            public void onMarkerDrag(Marker marker) {

            }

            @Override
            public void onMarkerDragEnd(Marker marker) {
                Toast.makeText(
                        BaiduOverActivity.this,
                        "拖拽结束,新位置:" + marker.getPosition().latitude + ", "
                                + marker.getPosition().longitude,
                        Toast.LENGTH_LONG).show();
            }

            @Override
            public void onMarkerDragStart(Marker marker) {

            }
        });
    }

六、setBaiduMarkListener() 方法,当点击覆盖物的时候定义相应的动作

/***
     * 设置当点击覆盖物时做的操作
     **/
    public void setBaiduMarkListener() {
        baidumap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(final Marker marker) {
                //动态创建button
                Button button = new Button(getApplicationContext());
                button.setBackgroundResource(R.mipmap.ground_overlay);
                InfoWindow.OnInfoWindowClickListener listener = null;
                if (marker == mMarkerA || marker == mMarkerD) {
                    button.setText("更改位置");
                    listener = new InfoWindow.OnInfoWindowClickListener() {
                        @Override
                        public void onInfoWindowClick() {
                            LatLng ll = marker.getPosition();
                            LatLng llNew = new LatLng(ll.latitude + 0.005,
                                    ll.longitude + 0.005);
                            marker.setPosition(llNew);
                            baidumap.hideInfoWindow();
                        }
                    };
                    LatLng lat = marker.getPosition();
                    infoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), lat, -47, listener);
                    baidumap.showInfoWindow(infoWindow);

                } else if (marker == mMarkerB) {
                    button.setText("更改图标");
                    listener = new InfoWindow.OnInfoWindowClickListener() {
                        @Override
                        public void onInfoWindowClick() {
                            marker.setIcon(db);
                            baidumap.hideInfoWindow();
                        }
                    };
                    LatLng lat = marker.getPosition();
                    infoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), lat, -47, listener);
                    baidumap.showInfoWindow(infoWindow);
                } else if (marker == mMarkerC) {
                    button.setText("删除");
                    button.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            marker.remove();
                            baidumap.hideInfoWindow();
                        }
                    });
                }
                LatLng lat = marker.getPosition();
                infoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), lat, -47, listener);
                baidumap.showInfoWindow(infoWindow);

                return true;
            }
        });
    }

七、当点击清空和重置按钮时,产生的操作

/**
     * 清空所有的overlay
     **/
    public void clearAllOverlay() {
        baidumap.clear();
        mMarkerA = null;
        mMarkerB = null;
        mMarkerC = null;
        mMarkerD = null;
    }

    /***
     * 重置Overlay
     **/
    public void resetOverlay() {
        clearAllOverlay();
        initOverlay();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.clear_overlay:
                clearAllOverlay();
                break;
            case R.id.reset_overlay:
                resetOverlay();
                break;
        }
    }

八、滑动seekBar,控制覆盖物的显示透明度

// 设置seekbar的监听
    private class SeekBarListner implements SeekBar.OnSeekBarChangeListener {

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            float alph = ((float) seekBar.getProgress()) / 10;
            if (mMarkerA != null) {
                mMarkerA.setAlpha(alph);
            }
            if (mMarkerB != null) {
                mMarkerB.setAlpha(alph);
            }
            if (mMarkerC != null) {
                mMarkerC.setAlpha(alph);
            }
            if (mMarkerD != null) {
                mMarkerD.setAlpha(alph);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    }

代码到这里,基本就结束了。



版权声明:本文为uniquemei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。