百度地图SDK Android版开发 7 覆盖物示例1

百度地图SDK Android版开发 7 覆盖物示例1

前言

文本介绍Marker的常用属性、交互和碰撞示例。

示例功能如下:

  • 可设置Marker点击、拖拽、透明、旋转、可见、平贴、碰撞和POI碰撞属性状态;
  • 在地图上创建多个满足上述属性状态的Marker;
  • Marker点击事件和拖拽事件处理。

界面布局

  • 布局文件
xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="MapMarkerActivity">

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:clickable="true"
        app:layout_constraintBottom_toTopOf="@id/bottomView"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.LinearLayoutCompat
        android:id="@+id/bottomView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/bmapView">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/background_dark"
            android:gravity="center_horizontal"
            android:orientation="horizontal"
            android:paddingHorizontal="10dp">

            <CheckBox
                android:id="@+id/clickable"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="true"
                android:onClick="setMarkerFlag"
                android:text="点击"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/draggable"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="拖拽"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/alpha"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="透明"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/rotate"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="旋转"
                android:textColor="@color/white"
                android:textStyle="bold" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:background="@android:color/background_dark"
            android:orientation="horizontal"
            android:paddingHorizontal="10dp">

            <CheckBox
                android:id="@+id/visible"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="true"
                android:onClick="setMarkerFlag"
                android:text="可见"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/flat"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="平贴"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/joinCollision"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="碰撞"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/poiCollided"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="POI碰撞"
                android:textColor="@color/white"
                android:textStyle="bold" />

        </LinearLayout>
    </androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>

MapMarker类

以下是MapMarker部分代码。

常量

java 复制代码
static final String CLICKABLE = "Clickable";
static final String DRAGGABLE = "Draggable";
static final String ALPHA = "Alpha";
static final String ROTATE = "Rotate";
static final String VISIBLE = "Visible";
static final String FLAT = "Flat";
static final String JOIN_COLLISION = "JoinCollision";
static final String POI_COLLIDED = "PoiCollided";

成员变量

java 复制代码
// 覆盖物列表
List<Overlay> overlays = new ArrayList<>();
// 选中的状态
List<String> selectedFlags = new ArrayList<>();
// 坐标点集
List<LatLng> points = new ArrayList<>();

初始值

java 复制代码
selectedFlags.add(CLICKABLE);
selectedFlags.add(VISIBLE);

points.add(new LatLng(39.97923, 116.357428));
points.add(new LatLng(39.94923, 116.397428));
points.add(new LatLng(39.97923, 116.437428));
points.add(new LatLng(39.92353, 116.490705));

Marker点击事件

java 复制代码
// 设置地图 Marker 覆盖物点击事件监听者,
// 自3.4.0版本起可设置多个监听对象,
// 停止监听时调用removeMarkerClickListener移除监听对象
map.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
    //marker被点击时回调的方法
    //若响应点击事件,返回true,否则返回false
    //默认返回false
    @Override
    public boolean onMarkerClick(Marker marker) {
        showToast("clickable marker");
        return true;
    }
});

Marker拖拽事件

java 复制代码
// 设置 Marker 拖拽事件监听者
map.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() {
    // 在Marker开始被拖拽时回调此方法,
    // 这个Marker的位置可以通过getPosition()方法获取 marker 被拖拽的Marker对象
    @Override
    public void onMarkerDragStart(Marker marker) {
    }

    // 在Marker拖拽过程中回调此方法,
    // 这个Marker的位置可以通过getPosition()方法获取 marker 被拖动的Marker对象
    @Override
    public void onMarkerDrag(Marker marker) {
        // 对marker处理拖拽逻辑
    }

    // 在Marker拖动完成后回调此方法,
    // 这个Marker的位置可以通过getPosition()方法获取 marker 被拖拽的Marker对象
    @Override
    public void onMarkerDragEnd(Marker marker) {
        // 拖拽完成后更新位置
        int index = overlays.indexOf(marker);
        if (index != -1) {
            LatLng latLng = marker.getPosition();
            points.set(index, new LatLng(latLng.latitude, latLng.longitude));
        }
    }
});

创建覆盖物

java 复制代码
public void addMarkers() {
    int[] icons = BubbleIcons.Alphabet;
    for (int i = 0; i < points.size(); ++i) {
        // 构建Marker图标
        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(icons[i]);
        // 构建MarkerOption,用于在地图上添加Marker
        MarkerOptions option = new MarkerOptions()
                .position(points.get(i)) //必传参数
                .icon(bitmap); // 必传参数
        setOption(option, i, selectedFlags);
        // 在地图上添加Marker,并显示
        Marker marker = (Marker) map.addOverlay(option);
        overlays.add(marker);
    }
}
private void setOption(MarkerOptions option, int i, List<String> flags) {
    if (flags.contains(CLICKABLE))
        option.clickable(true);
    else
        option.clickable(false);

    if (flags.contains(DRAGGABLE))
        option.draggable(true); // 设置Marker覆盖物是否可拖拽。

    if (flags.contains(ALPHA))
        option.alpha(0.5f + 0.1f * i); // 设置Marker覆盖物的透明度。

    if (flags.contains(ROTATE))
        option.rotate(30 * i); // 设置Marker覆盖物的图片旋转角度,从正北开始,逆时针计算。

    if (flags.contains(VISIBLE))
        option.visible(true); // 设置Marker覆盖物是否可见。
    else
        option.visible(false);

    if (flags.contains(FLAT))
        option.flat(true); // 设置平贴地图,在地图中双指下拉查看效果。

    if (flags.contains(JOIN_COLLISION)) {
        option.isJoinCollision(true) // 设置marker参与碰撞
                .isForceDisPlay(i % 2 == 0) // 设置压盖时 marker强制展示
                .priority(9);  // 设置碰撞优先级为9
    }

    if (flags.contains(POI_COLLIDED)) {
        option.poiCollided(true); // 设置是否碰撞底图POI
    }
}

移除覆盖物

java 复制代码
public void removeOverlay() {
    //map.removeOverLays(overlays);
    for (Overlay overlay : overlays)
        overlay.remove();
    overlays.clear();
}

设置属性

java 复制代码
public void addFlag(String flag) {
    if (!selectedFlags.contains(flag))
        selectedFlags.add(flag);

    removeOverlay();
    addMarkers();
}

public void removeFlag(String flag) {
    selectedFlags.remove(flag);

    removeOverlay();
    addMarkers();
}

MapMarkerActivity类

以下是MapMarkerActivity部分代码。

控件响应事件

java 复制代码
public void setMarkerFlag(View view) {
    boolean checked = ((CheckBox) view).isChecked();
    int id = view.getId();
    String flag;
    if (id == R.id.clickable)
        flag = MapMarker.CLICKABLE;
    else if (id == R.id.draggable)
        flag = MapMarker.DRAGGABLE;
    else if (id == R.id.alpha)
        flag = MapMarker.ALPHA;
    else if (id == R.id.rotate)
        flag = MapMarker.ROTATE;
    else if (id == R.id.visible)
        flag = MapMarker.VISIBLE;
    else if (id == R.id.flat)
        flag = MapMarker.FLAT;
    else if (id == R.id.joinCollision)
        flag = MapMarker.JOIN_COLLISION;
    else if (id == R.id.poiCollided)
        flag = MapMarker.POI_COLLIDED;
    else
        return;

    if (checked)
        mapMarker.addFlag(flag);
    else
        mapMarker.removeFlag(flag);
}

运行效果图

相关推荐
Gary Studio1 小时前
Android AIDL HAL工程结构示例
android
y = xⁿ2 小时前
MySQL八股知识合集
android·mysql·adb
andr_gale2 小时前
04_rc文件语法规则
android·framework·aosp
祖国的好青年3 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴4 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle
小米渣的逆袭4 小时前
Android ADB 完全使用指南
android·adb
儿歌八万首4 小时前
Jetpack Compose Canvas 进阶:结合 animateFloatAsState 让自定义图形动起来
android·动画·compose
zhangphil5 小时前
Android Page 3 Flow读sql数据库媒体文件,Kotlin
android·kotlin
神探小白牙5 小时前
echarts,3d堆叠图
android·3d·echarts