MapBox Android版开发 6 关于Logo
MapBox Android版开发 6 关于Logo
- Logo的显示
- 查看源码及思路(Logo)
- 第一步
- 第二步
- 隐藏Logo示例
- 查看源码及思路(Info)
- 第一步
- 第二步
- 隐藏Logo和Info示例
看到有网友留言问如何移除Logo,今天看了下V9源码,发现MapBox 提供了禁用Logo的功能。
先简单说下思路部分源码,最后是示例。
Logo的显示
MapBox通过MapView展示地图和地图上的要素,地图上的要素也是MapView的一部分。要隐藏其中一个元素,最先要考虑要素渲染的方式。
- 通过
Android控件叠在地图上。 - 借助覆盖物接口渲染。
- 在底层与地图一起渲染。
三种可能的显示方式,对应隐藏的难易程度也不通,隐藏方式也不同。
查看源码及思路(Logo)
第一步
接下来要确认MapBox是如何显示Logo的。先看MapView的源码。
步骤1:在MapView中可以很快找到方法MapView.initialiseLogoView,Logo是通过ImageView显示在地图上的。
protected ImageView initialiseLogoView() {ImageView logoView = new ImageView(this.getContext());addView(logoView);logoView.setTag("logoView");logoView.getLayoutParams().width = LayoutParams.WRAP_CONTENT;logoView.getLayoutParams().height = LayoutParams.WRAP_CONTENT;logoView.setImageDrawable(BitmapUtils.getDrawableFromRes(getContext(), R.drawable.mapbox_logo_icon));return logoView;
}
步骤2:查看MapView.initialiseLogoView 调用,在UiSettings.initialiseLogo方法中创建了Logo视图。
private void initialiseLogo(MapboxMapOptions options, @NonNull Resources resources) {isLogoInitialized = true;logoView = mapView.initialiseLogoView();setLogoEnabled(options.getLogoEnabled());setLogoGravity(options.getLogoGravity());setLogoMargins(resources, options.getLogoMargins());
}
步骤3:UiSettings与Logo相关的属性和接口,这其中就包含隐藏Logo的方法UiSettings.setLogoEnabled。
ImageView logoView;
boolean isLogoInitialized = false;private void initialiseLogo(MapboxMapOptions options, @NonNull Resources resources);
private void setLogoMargins(@NonNull Resources resources, @Nullable int[] logoMargins);
private void saveLogo(Bundle outState);
private void restoreLogo(Bundle savedInstanceState);
// Enables or disables the Mapbox logo.
public void setLogoEnabled(boolean enabled);
public boolean isLogoEnabled();
public void setLogoGravity(int gravity);
public int getLogoGravity();
public void setLogoMargins(@Px int left, @Px int top, @Px int right, @Px int bottom);
public int getLogoMarginLeft();
public int getLogoMarginTop();
public int getLogoMarginRight();
public int getLogoMarginBottom();
第二步
接下来的问题是,如何获取UiSettings对象?MapboxMap提供了方法。
UiSettings与MapboxMap部分类图:
隐藏Logo示例
在地图初始化成功后,通过MapboxMap的UiSettings对象,隐藏Logo。
mapView.getMapAsync(new OnMapReadyCallback() {@Overridepublic void onMapReady(@NonNull MapboxMap mapboxMap) {// 隐藏Logo mapboxMap.getUiSettings().setLogoEnabled(false);mapStyle = new MapStyle(mapboxMap);mapStyle.changeStyle(Style.MAPBOX_STREETS);}
});
运行效果图如下。
运行后发现在原本Logo的右侧还有一个 ⓘ,参考隐藏Logo的思路,接下来通过源码找隐藏 Info 的方法。

查看源码及思路(Info)
第一步
步骤1:在MapView初始化Logo代码中,Logo资源为R.drawable.mapbox_logo_icon,接下来找info对应的资源。
protected ImageView initialiseLogoView() {ImageView logoView = new ImageView(this.getContext());addView(logoView);logoView.setTag("logoView");logoView.getLayoutParams().width = LayoutParams.WRAP_CONTENT;logoView.getLayoutParams().height = LayoutParams.WRAP_CONTENT;logoView.setImageDrawable(BitmapUtils.getDrawableFromRes(getContext(), R.drawable.mapbox_logo_icon));return logoView;
}
步骤2:MapBox中drawable不多,能很快找到logo和info的资源。
mapbox_logo_icon.png
mapbox_info_icon_default.png
mapbox_info_icon_selected.png
mapbox_info_bg_selector
步骤3:MapView.initialiseAttributionView使用了info资源。
protected ImageView initialiseAttributionView() {ImageView attrView = new ImageView(this.getContext());addView(attrView);attrView.setTag("attrView");attrView.getLayoutParams().width = LayoutParams.WRAP_CONTENT;attrView.getLayoutParams().height = LayoutParams.WRAP_CONTENT;attrView.setAdjustViewBounds(true);attrView.setClickable(true);attrView.setFocusable(true);attrView.setContentDescription(getResources().getString(R.string.mapbox_attributionsIconContentDescription));attrView.setImageDrawable(BitmapUtils.getDrawableFromRes(getContext(), R.drawable.mapbox_info_bg_selector));// inject widgets with MapboxMapattrView.setOnClickListener(attributionClickListener = new AttributionClickListener(getContext(), mapboxMap));return attrView;
}
步骤4:查看MapView.initialiseAttributionView 调用,在UiSettings.initialiseAttribution方法中创建了Info视图。
private void initialiseAttribution(@NonNull Context context, MapboxMapOptions options) {isAttributionInitialized = true;attributionsView = mapView.initialiseAttributionView();setAttributionEnabled(options.getAttributionEnabled());setAttributionGravity(options.getAttributionGravity());setAttributionMargins(context, options.getAttributionMargins());int attributionTintColor = options.getAttributionTintColor();setAttributionTintColor(attributionTintColor != -1? attributionTintColor : ColorUtils.getPrimaryColor(context));
}
步骤3:UiSettings与Attribution相关的属性和接口,这其中就包含隐藏Info的方法UiSettings.setAttributionEnabled。
ImageView attributionsView;
private final int[] attributionsMargins = new int[4];
private AttributionDialogManager attributionDialogManager;
boolean isAttributionInitialized = false;private void initialiseAttribution(@NonNull Context context, MapboxMapOptions options);
private void setAttributionMargins(@NonNull Context context, @Nullable int[] attributionMargins);
private void saveAttribution(Bundle outState);
private void restoreAttribution(Bundle savedInstanceState);
// Enables or disables the attribution.
public void setAttributionEnabled(boolean enabled);
public boolean isAttributionEnabled();
public void setAttributionDialogManager(@NonNull AttributionDialogManager attributionDialogManager);
public AttributionDialogManager getAttributionDialogManager();
public void setAttributionGravity(int gravity);
public int getAttributionGravity();
public void setAttributionMargins(@Px int left, @Px int top, @Px int right, @Px int bottom);
public void setAttributionTintColor(@ColorInt int tintColor);
public int getAttributionMarginLeft();
public int getAttributionMarginTop();
public int getAttributionMarginBottom();
第二步
UiSettings与MapboxMap部分类图:
隐藏Logo和Info示例
在地图初始化成功后,通过MapboxMap的UiSettings对象,隐藏Logo和Info。
mapView.getMapAsync(new OnMapReadyCallback() {@Overridepublic void onMapReady(@NonNull MapboxMap mapboxMap) {// 隐藏Logo和InfomapboxMap.getUiSettings().setLogoEnabled(false);mapboxMap.getUiSettings().setAttributionEnabled(false);mapStyle = new MapStyle(mapboxMap);mapStyle.changeStyle(Style.MAPBOX_STREETS);}
});
运行效果图

相关文章:
MapBox Android版开发 6 关于Logo
MapBox Android版开发 6 关于Logo Logo的显示查看源码及思路(Logo)第一步第二步 隐藏Logo示例查看源码及思路(Info)第一步第二步 隐藏Logo和Info示例 看到有网友留言问如何移除Logo,今天看了下V9源码,发现M…...
2024年房市
24年8月15日,国家统计局公布,“7月末,商品房待售面积73926万平方米”。(原文链接:https://www.stats.gov.cn/sj/zxfb/202408/t20240815_1955982.html) 7.39亿平方存量商品房,估价均价1万每平,总价约&am…...
index索引
index索引: create index 【1】on 【2】(【3】) 1为索引名,通常为id_表名_列名。2为表名。3为列名。 CREATE INDEX id_account_id ON account(id); -- 根据id创建索引 CREATE INDEX id_account_idname on account(id,name); -- 创建组合索引 索…...
理解互联网链路:从本地ISP到Tier 1 ISP运营商
1. 互联网服务提供商(ISP) 互联网服务提供商(ISP)是指提供互联网接入服务的公司或组织。它们负责将用户连接到互联网,并提供相关的服务,如电子邮件、网站托管和其他在线服务。ISP可以分为不同的层级&#…...
基于元神操作系统实现NTFS文件操作(三)
1. 背景 本文主要介绍DBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作,所以只解析了少量的部分,其它部分可以参考相关文档进行理解。 DBR存在于磁盘分区的第一个扇区…...
深度学习与数学归纳法
最近发现,深度学习可以分为两个主要的阶段,分别是前向推理以及反向传播,分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候,本质上是在利用历史数据求网络参数的先验分布; …...
《Linux从小白到高手》理论篇(六):Linux软件安装一篇通
List item 本篇介绍Linux软件安装相关的操作命令,看完本文,有关Linux软件安装相关操作的常用命令你就掌握了99%了。 Linux软件安装 RPM RPM软件的安装、删除、更新只有root权限才能使用;查询功能任何用户都可以操作;如果普通用…...
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
1. 运行项目 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Appl…...
②EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器
EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 EtherCAT 串口网关 EtherCAT 转 RS485 (接上一章) 自由协议通信步骤 (以MS-A2-1041为例) 接收与…...
matlab-对比两张图片的HSV分量的差值并形成直方图
%对比两张图片的HSV分量的差值并形成直方图,改个路径就能用,图片分辨率要一致 close all; clear all; clc; I1imread(E:\test\resources\image\1.jpg); I2imread(E:\test\resources\image\2.jpg); HSV1 rgb2ntsc(I1); HSV2 rgb2ntsc(I2); %HSV,HSV 代…...
微服务SpringGateway解析部署使用全流程
官网地址: Spring Cloud Gateway 目录 1、SpringGateway简介 1、什么是网关 2、为什么用网关【为了转发】 2、应用: 1.启动nacos 2.创建网关项目 3.网关配置1 4.网关配置2【了解】 5.过滤器配置【了解】 1、SpringGateway简介 核心功能有三个&…...
Solidity 存储和内存管理:深入理解与高效优化
在 Solidity 中,存储和内存管理是编写高效智能合约的关键组成部分。合约执行的每一步操作都可能涉及到数据的存储和读取,而这些操作对 gas 的消耗有很大影响。因此,理解 Solidity 的存储模型以及如何优化数据的管理对于合约的安全性、性能和成…...
机器学习篇-day02-KNN算法实现鸢尾花模型和手写数字识别模型
一. KNN简介 KNN思想 K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别 KNN算法思想:如果一个样本在特征空间中的k 个最相似的样本中的大多数属于某一个类别,则该样本也属…...
【C++】STL--vector
1.vector的介绍 我们先来看看vector的文档介绍,实际中我们只要熟悉相关接口就好了。 成员函数 使用STL的三个境界:能用,明理,能扩展 ,那么下面学习vector,我们也是按照这个方法去学习 2 vector的使用 v…...
Java使用Redis的详细教程
Redis是一个基于内存的key-value结构数据库,即非关系型数据库,具有高性能、丰富的数据类型、持久化、高可用性和分布式等特点。在Java项目中,Redis通常用于缓存、分布式锁、计数器、消息队列和排行榜等场景。以下是在Java中使用Redis的详细教…...
严重 Zimbra RCE 漏洞遭大规模利用(CVE-2024-45519)
攻击者正在积极利用 CVE-2024-45519,这是一个严重的 Zimbra 漏洞,该漏洞允许他们在易受攻击的安装上执行任意命令。 Proofpoint 的威胁研究人员表示,攻击始于 9 月 28 日,几周前,Zimbra 开发人员发布了针对 CVE-2024-…...
php函数积累
对称函数 isset 判断数组arr中是否存在键key 返回值true/false isset(name,$arr) unset 删除数组中的键 需存在key不然抛出异常 unset($arr[name]) json_encode 数据转json格式 json_encode($arr) 一般形式 指定字符编码形式 json_decode json格式转原有数据格式 json_d…...
前端项目场景相关的面试题,包含验证码、图片存储、登录鉴权、动态路由、组件划分等项目场景实际的面试题
项目场景面试题 如何防止短信验证码被刷 问题场景 添加倒计时和图片滑动验证,避免不必要的资源浪费 发送短信验证码需要费用发送短信消耗服务器资源 公司的图片、视频、文件资源如何存储的 传统模式 分开存储到数据服务器,托管服务器到云端 缺点&…...
uniapp 上了原生的 echarts 图表插件了 兼容性还行
插件地址:echarts - DCloud 插件市场 兼容性这块儿不知道后期会不会支持其他浏览器 H5 的话建议可以用原生的不用这个插件...
共享单车轨迹数据分析:以厦门市共享单车数据为例(八)
副标题:基于POI数据的站点综合评价——以厦门市为例(三) 什么是优劣解距离法(TOPSIS)? 优劣解距离法(Technique for Order Preference by Similarity to Ideal Solution,简称TOPSI…...
产品兼容性实战:硬件与软件设计的平衡艺术与工程策略
1. 产品兼容性:一个永恒的工程与商业困境在硬件开发,尤其是数据采集、测试测量这类领域里,产品经理和工程师们几乎每天都在面对一个看似无解的难题:新产品的功能要向前狂奔,但老用户的兼容性需求却像一根锚,…...
n8n与Claude集成指南:构建AI代码生成与自动化执行工作流
1. 项目概述与核心价值最近在折腾自动化工作流时,我偶然发现了一个名为n8n-claude-code-guide的开源项目。这个项目乍一看名字,你可能以为它只是一个简单的代码指南,但深入探究后,你会发现它实际上是一个将两个强大的工具——n8n和…...
Intel RealSense D435深度数据采集全流程:从Viewer截图到.csv/.raw文件深度解析
Intel RealSense D435深度数据采集全流程:从Viewer截图到.csv/.raw文件深度解析 深度视觉技术正在重塑工业检测、机器人导航和三维重建等领域的工作流程。作为Intel RealSense系列中的明星产品,D435深度相机以其出色的性价比和易用性,成为开发…...
加拿大无人机产业:从感知到执行的自主化跃迁与BVLOS破局
1. 加拿大无人机产业的现状与挑战提起无人机,很多人脑海里首先蹦出来的可能是大疆,那个在全球消费级和部分商用市场占据绝对主导地位的中国品牌。这确实是一个不争的事实,也是加拿大本土无人机产业必须直面的现实。我接触过不少加拿大的初创公…...
从昆虫飞行到机器人导航:碰撞容忍型Gimbal机器人的仿生设计哲学
1. 项目概述:从“硬闯”到“巧过”的机器人导航哲学 在机器人导航领域,我们似乎已经习惯了“感知-规划-行动”的经典范式。从激光雷达、深度相机到复杂的SLAM算法,工程师们投入海量资源,只为让机器人像人一样,优雅地识…...
终极指南:如何用Python轻松解锁QQ音乐资源,打造个人音乐库
终极指南:如何用Python轻松解锁QQ音乐资源,打造个人音乐库 【免费下载链接】MCQTSS_QQMusic QQ音乐解析 项目地址: https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic 你是否曾遇到过这样的困扰?在QQ音乐上发现了一首心仪的歌曲&…...
量子误差缓解技术与BBGKY层次结构的应用
1. 量子误差缓解的现状与挑战在当前的NISQ(噪声中等规模量子)时代,量子计算机的实际应用面临着一个根本性障碍:量子噪声。与经典计算机不同,量子比特极易受到环境干扰,导致计算错误。这种噪声主要来源于量子…...
36种阀体混线全自动智能分拣方案|3D视觉+机器人柔性制造实践
一、项目背景与行业痛点在高端流体控制设备制造领域,阀体、阀盖的精密分拣是保障产品质量的核心环节。随着工业设备向小型化、高精度方向发展,客户对阀体组件加工误差的控制要求持续提升,传统生产模式面临显著瓶颈:1. 人工分拣效率…...
Raycast扩展vscode-control:用全局启动器遥控VS Code提升开发效率
1. 项目概述:一个为Raycast打造的VS Code遥控器 如果你和我一样,每天大部分时间都泡在代码编辑器里,那么你一定对频繁在编辑器、终端、浏览器和启动器之间切换感到厌烦。尤其是当你需要快速执行一个格式化操作、运行一个NPM脚本,…...
基于VLLM与VoxCPM2的高并发TTS服务器部署与调优指南
1. 项目概述:uttera-tts-vllm,一个为高并发而生的TTS服务器如果你正在寻找一个能扛住高并发请求、支持实时语音克隆、并且完全自托管的文本转语音解决方案,那么uttera-tts-vllm绝对值得你花时间研究一下。这个项目本质上是一个基于 FastAPI 构…...
