百度地图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);
}

运行效果图

相关推荐
拭心5 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
带电的小王7 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡8 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道8 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库9 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道9 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe10 小时前
Android Hook - 动态加载so库
android
居居飒10 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
Henry_He13 小时前
桌面列表小部件不能点击的问题分析
android
工程师老罗13 小时前
Android笔试面试题AI答之Android基础(1)
android