首页 > 其他分享 >百度地图SDK Android版开发 11 覆盖物示例 4 线

百度地图SDK Android版开发 11 覆盖物示例 4 线

时间:2024-09-12 23:20:02浏览次数:3  
标签:11 option 示例 int final add new Android id

百度地图SDK Android版开发 11 覆盖物示例 4 线

前言

文本通过创建多个不同线宽的折线和大地曲线,介绍Polyline的使用方法。

线的属性包括是否可点击、是否虚线、分段属性、发光属性和大地曲线。

  • 分段属性包括分段颜色分段纹理渐变色。只能选一或不选。
  • 发光属性包括渐变发光模糊发光。只能选一或不选。
  • 分段属性发光属性大地曲线只能选一或不选。

为了直观显示线的属性,仅使用了CheckBox控件,多种属性只能选一通过代码实现。

界面布局

在这里插入图片描述

  • 布局文件
<?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="com.example.baidudemo.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/dottedLine"
                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/colors"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="分段颜色"
                android:textColor="@color/yellow_800"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/textures"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="分段纹理"
                android:textColor="@color/yellow_800"
                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/gradient"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="false"
                android:onClick="setMarkerFlag"
                android:text="渐变色"
                android:textColor="@color/yellow_800"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/bloomGradientA"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="渐变发光"
                android:textColor="@color/blue_500"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/bloomBlur"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:onClick="setMarkerFlag"
                android:text="模糊发光"
                android:textColor="@color/blue_500"
                android:textStyle="bold" />

            <CheckBox
                android:id="@+id/geodesic"
                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>
    </androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>

MapPolyline类

以下为MapPolyline类部分代码。

常量

public static final String CLICKABLE = "clickable"; // 点击
public static final String DOTTED_LINE = "DottedLine"; // 虚线
public static final String COLORS = "Colors"; // 分段颜色
public static final String TEXTURES = "Textures"; // 分段纹理
public static final String GRADIENT = "Gradient"; // 渐变色
public static final String BLOOM_GRADIENT_A = "BloomGradientA"; // 渐变发光
public static final String BLOOM_BLUR = "BloomBlur"; // 模糊发光
public static final String GEODESIC = "Geodesic"; // 大地曲线
  • 渐变色
final static int COLOR_RED = 0xAAD50000;
final static int COLOR_YELLOW = 0xAAF57F17;
final static int COLOR_BLUE = 0xAA0D47A1;
final static int COLOR_GREEN = 0xAA33691E;
  • 折线线宽:多个折线的宽度依次为5,10, 15, ……

关于折线宽度(来自API参考)

设置折线线宽, 默认为 5, 单位:像素 需要注意的是:Polyline的宽度适配地图当前缩放级别下的像素与地理范围的对应关系

final static int LINE_WIDTH_MIN = 5;
final static int LINE_WIDTH_STEP = 5;

成员变量

// 覆盖物列表
List<Overlay> overlays = new ArrayList<>();
// 选中的状态
List<String> selectedFlags = new ArrayList<>();

List<List<LatLng>> lines = new ArrayList<>(); // 多个折线
List<LatLng> geodesicLine = new ArrayList<>(); // 大地曲线坐标 仅两个点
ArrayList<BitmapDescriptor> bitmaps = new ArrayList<>(); // 纹理
List<Integer> colorValues = new ArrayList<>(); // 渐变色

初始值

  • 默认选中选项
selectedFlags.add(CLICKABLE);
  • 多个折线和大地曲线
double latSpan = 0.05;
for (int i = 0; i < 5; ++i) {
    List<LatLng> points = new ArrayList<>();
    points.add(new LatLng(39.865 + latSpan * i, 116.254));
    points.add(new LatLng(39.865 + latSpan * i, 116.304));
    points.add(new LatLng(39.825 + latSpan * i, 116.354));
    points.add(new LatLng(39.855 + latSpan * i, 116.394));
    points.add(new LatLng(39.805 + latSpan * i, 116.454));
    points.add(new LatLng(39.865 + latSpan * i, 116.504));
    points.add(new LatLng(39.805 + latSpan * i, 116.544));
    lines.add(points);
}

geodesicLine.add(new LatLng(36.53, -121.47));
geodesicLine.add(new LatLng(22.33, 114));
  • 纹理和颜色(纹理图来自官方Demo)
final String[] assetNames = {
        "Icon_road_red_arrow.png",
        "Icon_road_yellow_arrow.png",
        "Icon_road_blue_arrow.png",
        "Icon_road_green_arrow.png",
};
for (String name : assetNames) {
    bitmaps.add(BitmapDescriptorFactory.fromAsset(name));
}

final int[] colors = {COLOR_RED, COLOR_YELLOW, COLOR_BLUE, COLOR_GREEN};
for (int color : colors)
    colorValues.add(color);
  • 点击事件
initEvent();
private void initEvent() {
    map.setOnPolylineClickListener(new BaiduMap.OnPolylineClickListener() {
        @Override
        public boolean onPolylineClick(Polyline polyline) {
            showToast("click polyline");
            return true;
        }
    });
}

创建覆盖物

  • 创建大地曲线或创建多个折线
public void addOverlays() {
    if (selectedFlags.contains(GEODESIC)) {
        // 创建大地曲线
        PolylineOptions polylineOptions = new PolylineOptions()
                .width(LINE_WIDTH_MIN)
                .color(COLOR_RED)
                // 设置Polyline头尾形状类型
                .lineCapType(PolylineOptions.LineCapType.LineCapRound)
                // 设置Polyline拐点衔接的形状类型
                .lineJoinType(PolylineOptions.LineJoinType.LineJoinRound)
                .points(geodesicLine);

        setOption(polylineOptions, selectedFlags);

        // 在地图上绘制折线
        Polyline polyline = (Polyline) map.addOverlay(polylineOptions);
        overlays.add(polyline);
        return;
    }

    // 创建多个折线
    int width = LINE_WIDTH_MIN;
    for (List<LatLng> points : lines) {
        PolylineOptions polylineOptions = new PolylineOptions()
                .width(width)
                .color(COLOR_RED)
                // 设置Polyline头尾形状类型
                .lineCapType(PolylineOptions.LineCapType.LineCapRound)
                // 设置Polyline拐点衔接的形状类型
                .lineJoinType(PolylineOptions.LineJoinType.LineJoinRound)
                .points(points);

        setOption(polylineOptions, selectedFlags);

        // 在地图上绘制折线
        Polyline polyline = (Polyline) map.addOverlay(polylineOptions);
        overlays.add(polyline);

        width += LINE_WIDTH_STEP;
    }
}
  • 设置折线属性
private void setOption(PolylineOptions option, List<String> flags) {
    if (flags.contains(CLICKABLE))
        option.clickable(true);
    else
        option.clickable(false);

    if (flags.contains(DOTTED_LINE)) {
        // 设置折线显示为虚线
        option.dottedLine(true);
        // 设置虚线形状
        // PolylineDottedLineType.DOTTED_LINE_SQUARE
        // PolylineDottedLineType.DOTTED_LINE_CIRCLE
        option.dottedLineType(PolylineDottedLineType.DOTTED_LINE_SQUARE);
    }

    if (flags.contains(COLORS)) {
        // 设置折线每个点的颜色值
        // 每一个点带一个颜色值,绘制时按照索引依次取值 颜色个数 >= points的个数,
        // 若colors越界大于点个数,则取最后一个颜色绘制
        // 注意颜色值得格式为:0xAARRGGBB
        option.colorsValues(colorValues);
    }

    if (flags.contains(TEXTURES)) {
        // 添加纹理索引
        List<Integer> indexList = new ArrayList<>();
        for (int i = 0; i < bitmaps.size(); ++i)
            indexList.add(i);

        //
        option.customTextureList(bitmaps);
        // 设置纹理列表
        option.textureIndex(indexList);
    }

    if (flags.contains(GRADIENT)) {
        // 渐变色折线
        option.isGradient(true);
        option.colorsValues(colorValues);
    }

    if (flags.contains(BLOOM_GRADIENT_A)) {
        // 设置发光模式
        option.bloomType(PolylineOptions.LineBloomType.GradientA);
        // 设置发光下的宽度
        option.bloomWidth(option.getWidth() * 2);
        // 设置发光透明度(0~255) 默认线段透明度
        option.bloomAlpha(0xAA);
        // 设置透明度渐变发光效果的渐变速率(1.0 ~ 10.0)默认5.0f
        option.setBloomGradientASpeed(5.0f);
    }

    if (flags.contains(BLOOM_BLUR)) {
        // 设置发光模式
        option.bloomType(PolylineOptions.LineBloomType.BLUR);
        // 设置发光下的宽度
        option.bloomWidth(option.getWidth() * 2);
        // 设置发光透明度(0~255) 默认线段透明度
        option.bloomAlpha(0xAA);
        // 设置模糊发光效果的模糊次数(1~10次) 默认1次
        option.setBloomBlurTimes(2);
    }

    if (flags.contains(GEODESIC)) {
        // 大地曲线
        option.isGeodesic(true);
        // 折线经度跨180需增加此字段
        option.lineDirectionCross180(PolylineOptions.LineDirectionCross180.FROM_WEST_TO_EAST);
    }
}

移除覆盖物

public void removeOverlay() {
    //map.removeOverLays(overlays);
    for (Overlay overlay : overlays)
        overlay.remove();
    overlays.clear();
}

设置属性

public void setFlags(List<String> flags) {
    selectedFlags.clear();
    selectedFlags.addAll(flags);

    removeOverlay();
    addOverlays();
}

加载地图和释放地图

public void onMapLoaded() {
    initEvent();
    addOverlays();
}

public void onMapDestroy() {
    removeOverlay();

    for (BitmapDescriptor bitmap : bitmaps) {
        bitmap.recycle();
    }
    bitmaps = null;
}

MapPolylineActivity类

以下是MapPolylineActivity类部分代码

控件响应事件

**说明:**为了直观显示线的属性,仅使用了CheckBox控件,多种属性只能选一通过代码实现。

public void setMarkerFlag(View view) {
    // 分段颜色、纹理、渐变、大地曲线
    List<Integer> group1 = Arrays.asList(R.id.colors, R.id.textures, R.id.gradient, R.id.geodesic);
    // 分段颜色、纹理、渐变
    List<Integer> group2 = Arrays.asList(R.id.bloomGradientA, R.id.bloomBlur, R.id.geodesic);

    boolean checked = ((CheckBox) view).isChecked();
    int id = view.getId();
    if (checked) {
        if (group1.contains(id)) {
            for (int checkBoxId : group1) {
                if (checkBoxId != id) {
                    ((CheckBox) findViewById(checkBoxId)).setChecked(false);
                }
            }
        }
        if (group2.contains(id)) {
            for (int checkBoxId : group2) {
                if (checkBoxId != id) {
                    ((CheckBox) findViewById(checkBoxId)).setChecked(false);
                }
            }
        }
    }

    update();
}
private void update() {
    final int[] ids = {R.id.clickable,
            R.id.dottedLine,
            R.id.colors,
            R.id.textures,
            R.id.gradient,
            R.id.bloomGradientA,
            R.id.bloomBlur,
            R.id.geodesic,
    };
    final String[] optins = {MapPolyline.CLICKABLE,
            MapPolyline.DOTTED_LINE,
            MapPolyline.COLORS,
            MapPolyline.TEXTURES,
            MapPolyline.GRADIENT,
            MapPolyline.BLOOM_GRADIENT_A,
            MapPolyline.BLOOM_BLUR,
            MapPolyline.GEODESIC,
    };
    List<String> flags = new ArrayList<>();
    for (int i = 0; i < ids.length; ++i) {
        CheckBox checkBox = findViewById(ids[i]);
        if (checkBox.isChecked())
            flags.add(optins[i]);
    }
    mapPolyline.setFlags(flags);
}

运行效果图

1234
567在这里插入图片描述

标签:11,option,示例,int,final,add,new,Android,id
From: https://blog.csdn.net/kikikiki001/article/details/142188138

相关文章

  • 0910-0911 shell编程与基础算法(leetCode )
    栈的定义栈(Stack),也称为堆栈,它是一种特殊的线性表,只允许在表的一端进行插入和删除操作。允许在表操作的一端称为栈顶(Top),另一端称为栈底(Bottom)。栈顶是动态变化的,它由一个称为栈顶指针(top)的变量指示。当表中没有元素时,称为空栈。栈的插入操作称为入栈或进栈,删除操作称为出栈或......
  • 代码随想录算法训练营,9月12日 | 513.找树左下角的值,112. 路径总和,106.从中序与后序遍
    513.找树左下角的值题目链接:513.找树左下角的值文档讲解︰代码随想录(programmercarl.com)视频讲解︰找树左下角的值日期:2024-09-12想法:1.迭代:用层序遍历,遍历每层时记录下第一个节点的值,到最后一层就是要求的值;2.递归:根据最大的深度来找目标值。Java代码如下://迭代classSolut......
  • HX711 的数值换算:以Excel表格为工具
    步骤0:获取已知数据首先,需要得到几个已知条件:1.首先是HX711电路的两个电阻的阻值R1,R2:目的是算出激励电压。2.然后是你手上拉力传感器的量程A(kg),拉力传感器的灵敏度(mV/V)3.其他HX711编程确定的参数(一般默认),如放大倍数为128倍,数值精度为24位。下面以HX711电路R1=15k......
  • day11-多线程
    一、线程安全问题线程安全问题出现的原因?存在多个线程在同时执行同时访问一个共享资源存在修改该共享资源线程安全:多个线程同时修改同一个资源取钱案例小明和小红是一对夫妻,他们有一个共同的账户,余额是10万元如果小明和小红同时来取钱,并且2人各自......
  • [20240911]查看超长视图的定义2.txt
    [20240911]查看超长视图的定义2.txt--//昨天看了链接:https://www.anbob.com/archives/8295.html,提供了另外的方式获得超长定义试图的长文本。--//我重复验证看看.1.环境:SYS@book>@ver2==============================PORT_STRING                  :x86_6......
  • SCIE1104 Fisheries health
    AssignmentTWOQuestionsandAssessmentGuideDatasetsTherelevantdatasetscanbefoundontheLMS.SubmittingAssignmentTWOTheassignmentmustbesubmittedviatheLMS.Pleasecompilethefinalassignmentdocumentintoapdfdocumentbeforesubmis......
  • WPF 的 WriteableBitmap 在 Intel 11 代 Iris Xe Graphics 核显设备上停止渲染
    在Intel11代锐炬Intel®Iris®XeGraphics核显设备上,如果此设备使用旧版本驱动,则可能导致WPF的WriteableBitmap停止渲染。此问题和WPF无关,此问题是Intel的bug且最新驱动版本已修复官方问题记录地址:https://www.intel.cn/content/www/cn/zh/support/articles/000......
  • 基于java的美食信息推荐系统的设计与实现(11315)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • P1110
    delicious#include<bits/stdc++.h>usingnamespacestd;constintinf=0x3f3f3f3f;multiset<int>delta,full;intst[500100],ed[500100];intsrt=inf;intn,m;voidupdate_srt(intx){ multiset<int>::iteratorit=full.lower_bound(x); intnw=*it......
  • P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题
    P11036【MX-X3-T3】「RiOI-4」GCD与LCM问题题意描述给出\(a\),求一组构造\(b,c,d\)使得\(a+b+c+d=gcd(a,b)+lcm(c,d)\)同时需要保证\(b,c,d\le1634826193\)思路变量实在太多了,考虑先大胆消掉一个,令\(b=1\),此时问题简化为使得\(a+c+d=lcm(c,d)\)赛时真的没想出......