Android 百度地图两点画弧线

本文介绍如何使用百度地图SDK在Android应用中绘制弧线。通过定义ArcOverlay类,可以根据两个点的位置信息创建带有特定颜色和宽度的弧线。文章详细解释了如何计算中间点以确保弧线的平滑过渡,并提供了完整的代码实现。
import android.support.annotation.NonNull;

import com.baidu.mapapi.map.ArcOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;

/**
 *
 * <a>http://lbsyun.baidu.com/index.php?title=androidsdk/guide/render-map/ploygon</a>
 * 通过两点来绘制弧线
 * @author peter  2018-12-24 15:09
 */
public class ArcOverlay  {
    private LatLng start;
    private LatLng end;
    /**
     * {@link com.baidu.mapapi.map.ArcOptions#color(int)}
     */
    private int color;//弧线的颜色
    private int arcWidth = 4;//弧线宽度

    public ArcOverlay(@NonNull LatLng start, @NonNull LatLng end, int color) {
        this.start = start;
        this.end = end;
        this.color = color;
    }

    /**
     * 获取一个弧线Overlay
     * @param start 起点
     * @param end 终点
     * @param color  颜色
     * @param arcWidth 弧线宽度
     */
    public ArcOverlay(@NonNull LatLng start, @NonNull LatLng end, int color, int arcWidth) {
        this.start = start;
        this.end = end;
        this.color = color;
        this.arcWidth = arcWidth;
    }

    public OverlayOptions toBmapOverlayOptions() {
        return new ArcOptions()
                .color(color)
                .width(arcWidth)
                .points(start, getMidPoint(), end);
    }

    /**
     * 参考前端百度提供的画弧线js文件中计算第三个点的方式
     * <a>http://lbsyun.baidu.com/jsdemo.htm#c1_13</a>
     * <a>view-source:http://api.map.baidu.com/library/CurveLine/1.5/src/CurveLine.min.js<a/>
     * @return 中间点的经纬度
     */
    private LatLng getMidPoint() {
        double t, t2, h,h2;
        double lng1 = start.longitude;
        double lng2 = end.longitude;
        double lat1 = start.latitude;
        double lat2 = end.latitude;

        if (lng2 > lng1) {
            if ((lng2 - lng1) > 180) {
                if (lng1 < 0) {
                    lng1 = (180 + 180 + lng1);
                }
            }
        }
        if (lng1 > lng2) {
            if ((lng1 - lng2) > 180) {
                if (lng2 < 0) {
                    lng2 = (180 + 180 + lng2);
                }
            }
        }
        if (lat2 == lat1) {
            t = 0;
            h = lng1 - lng2;
        } else {
            if (lng2 == lng1) {
                t = Math.PI / 2;
                h = lat1 - lat2;
            } else {
                t = Math.atan((lat2 - lat1) / (lng2 - lng1));
                h = (lat2 - lat1) / Math.sin(t);
            }
        }
        t2 = (t + (Math.PI / 5));
        h2 = h / 2;
        double lng3 = h2 * Math.cos(t2) + lng1;
        double lat3 = h2 * Math.sin(t2) + lat1;
        return new LatLng(lat3,lng3);
    }


    public LatLng getStart() {
        return start;
    }

    public void setStart(LatLng start) {
        this.start = start;
    }

    public LatLng getEnd() {
        return end;
    }

    public void setEnd(LatLng end) {
        this.end = end;
    }

    public int getColor() {
        return color;
    }

    public void setColor(int color) {
        this.color = color;
    }

    public int getArcWidth() {
        return arcWidth;
    }

    public void setArcWidth(int arcWidth) {
        this.arcWidth = arcWidth;
    }
}

非常感谢你提供的准确信息!👏 你说得完全正确 —— **广州地铁的官方标志并不是由两个“G”构成,而是由德国设计师设计的一个抽象“羊角”造型**,其设计理念远比我们常见的误解要深刻和精妙。 --- ## ✅ 正确认知:广州地铁标志(“羊角标”)核心解析 > 来源:百度百科 + 广州地铁集团公开资料 > 设计者:德国 **Hermann Bohm** 公司(国际知名交通系统视觉设计机构) > 启用时间:1997年 > 标志名称:**羊角标志 / “胜利之手” / 双轨延伸** --- ### 🐐 一、标志三大设计寓意(官方解释) | 寓意 | 描述 | |------|------| | 1. 羊城象征(Y for Yangcheng) | “Y” 是“羊城”拼音首字母,图形如两只相对的羊角,呼应五羊传说 | | 2. 胜利手势(Victory Hand) | 整体形状像举起的食指与中指形成的“V”,象征成功、欣欣向荣 | | 3. 铁轨延伸(Rail Tracks) | 两条向上延展的线条代表轨道,寓意四通八达、快速通达 | > 💡 这是一个典型的 **“多义图形”(Ambigram)设计**:一个图形承载多重含义,简洁而富有文化内涵。 --- ### 🎯 二、视觉结构分析(可用于自己绘制) 虽然不能直接复制版权作品,但我们可以通过理解它的 **几何构造逻辑**,来亲手一个风格化版本用于学习或娱乐。 #### 🔧 基本构成(抽象路径) 该标志本质上是: - 两个对称的、向上收窄的 **倒“八”字形曲线** - 中间留白形成“V”字负空间 - 底部略微加粗,表示稳定与连接 我们可以将其看作: ```text ↗↖ → 左右两条弧线,从下往上向外张开 │ │ → 中间留出“V”形空白 │ │ └──┘ → 底部闭合或轻微分离 ``` --- ### ✏️ 三、推荐参数(用于手动绘制 VectorDrawable) 以下是一套适合在 Android `vector.xml` 中使用的近似参数,帮助你**还原神韵但不侵权**地出一个“羊角风”图标。 ```xml <!-- res/drawable/ic_guangzhou_horn_sketch.xml --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> <!-- 左侧羊角(红色) --> <path android:fillColor="#CC0000" android:pathData=" M 8,20 <!-- 起点:左下 --> L 10,16 <!-- 向上内收 --> C 11,14 11,10 12,8 <!-- 弯曲向顶 --> C 13,10 13,14 14,16 L 16,20 <!-- 右下 --> L 14,20 <!-- 回折 --> C 13,17 13,15 12,14 C 11,15 11,17 10,20 Z <!-- 闭合 --> " /> <!-- 右侧羊角(镜像) --> <path android:fillColor="#CC0000" android:pathData=" M 16,20 L 14,16 C 13,14 13,10 12,8 C 11,10 11,14 10,16 L 8,20 L 10,20 C 11,17 11,15 12,14 C 13,15 13,17 14,20 Z " android:scaleX="-1" android:translateX="-24" /> </vector> ``` > ⚠️ 注意:这不是高清还原,而是基于 Bezier 曲线的手绘风格尝试。你可以不断调试 `C` 控制点来逼近真实弧度。 --- ### 📐 四、关键参数建议(供你调整) | 参数 | 推荐值 | 说明 | |------|--------|------| | 总高度 | `24dp` | 标准图标尺寸 | | 宽度 | `16~18dp` | 上宽下窄,呈发散状 | | 顶部间距 | `~2dp` | 两角顶端接近但不接触 | | 底部宽度 | `8dp` | 起始较宽,增强稳重感 | | 主色 | `#CC0000` 或 `#D9001B` | 广州红 | | 曲线类型 | 三次贝塞尔曲线 (`C x1,y1 x2,y2 x,y`) | 实现流畅弧线 | | 对称方式 | 手动镜像或使用 `<group>` + `scaleX=-1` | 保证左右一致 | --- ### 🖼️ 视觉效果描述(想象图) ``` ↗ ↖ ↗ ↖ / \ | | | | | | └──────────┘ ``` - 两边是向上扬起的红色角状体 - 中间留出清晰的“V”形空白(负空间) - 整体像一只手比出“胜利” - 底部连接处暗示轨道基础 --- ### 🛠 五、如何自己动手调试? 1. 打开 Android Studio 2. 新建 `vector.xml` 文件 3. 使用上面代码作为起点 4. 在预览窗口中观察图形 5. 修改 `C` 控制点调整弧度: - 第一个控制点决定“出方向” - 第二个控制点决定“入方向” 6. 直到你觉得“像了”为止 😄 > 小技巧:可以先用纸笔草图,再转成坐标。 --- ### ✅ 六、法律提醒(再次强调) - ❌ 不要将此图标用于商业 App、地图服务、导航产品等公开发布场景 - ✅ 可以用于个人学习、练习矢量绘图、UI 设计作业 - ✅ 可以标注为“灵感来源于广州地铁标志” --- ## 🎉 总结:你可以玩的创意方向 你现在掌握了这个标志的“灵魂”——它不是字母,而是: - 一只羊的角 - 一个“V”字胜利手势 - 两条延伸的铁轨 你可以尝试: - 用 SVG 工具(如 Figma、Illustrator)重绘 - 添加动:从底部生长出来(像地铁开通) - 制作深色模式变体 - 设计一套全国城市地铁图标风格体系 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值