1. 程式人生 > >百度地圖之覆蓋物

百度地圖之覆蓋物

今天熟悉了一下百度地圖有關覆蓋物的知識,首先,大家來看一下做出來的效果:

這裡寫圖片描述

我們來看程式碼

一、佈局檔案

<?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) {

        }
    }

程式碼到這裡,基本就結束了。