首页 > 其他分享 >MapBox Android版开发 6 关于Logo

MapBox Android版开发 6 关于Logo

时间:2024-09-27 21:20:46浏览次数:7  
标签:UiSettings int void logoView MapBox Logo Android public

MapBox Android版开发 6 关于Logo

看到有网友留言问如何移除Logo,今天看了下V9源码,发现MapBox 提供了禁用Logo的功能。

先简单说下思路部分源码,最后是示例。

Logo的显示

MapBox通过MapView展示地图和地图上的要素,地图上的要素也是MapView的一部分。要隐藏其中一个元素,最先要考虑要素渲染的方式。

  1. 通过Android控件叠在地图上。
  2. 借助覆盖物接口渲染。
  3. 在底层与地图一起渲染。

三种可能的显示方式,对应隐藏的难易程度也不通,隐藏方式也不同。

查看源码及思路(Logo)

第一步

接下来要确认MapBox是如何显示Logo的。先看MapView的源码。

步骤1:在MapView中可以很快找到方法MapView.initialiseLogoViewLogo是通过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());
}

步骤3UiSettingsLogo相关的属性和接口,这其中就包含隐藏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提供了方法。

UiSettingsMapboxMap部分类图:

UiSettings +void setLogoEnabled(boolean enabled) MapboxMap -UiSettings uiSettings +UiSettings getUiSettings()

隐藏Logo示例

在地图初始化成功后,通过MapboxMapUiSettings对象,隐藏Logo

mapView.getMapAsync(new OnMapReadyCallback() {
    @Override
    public 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;
}

步骤2MapBoxdrawable不多,能很快找到logoinfo的资源。

mapbox_logo_icon.png
mapbox_info_icon_default.png
mapbox_info_icon_selected.png
mapbox_info_bg_selector

步骤3MapView.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 MapboxMap
  attrView.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));
}

步骤3UiSettingsAttribution相关的属性和接口,这其中就包含隐藏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();

第二步

UiSettingsMapboxMap部分类图:

UiSettings +void setLogoEnabled(boolean enabled) +void setAttributionEnabled(boolean enabled) MapboxMap -UiSettings uiSettings +UiSettings getUiSettings()

隐藏Logo和Info示例

在地图初始化成功后,通过MapboxMapUiSettings对象,隐藏LogoInfo

mapView.getMapAsync(new OnMapReadyCallback() {
    @Override
    public void onMapReady(@NonNull MapboxMap mapboxMap) {
        // 隐藏Logo和Info
        mapboxMap.getUiSettings().setLogoEnabled(false);
        mapboxMap.getUiSettings().setAttributionEnabled(false);
      
        mapStyle = new MapStyle(mapboxMap);
        mapStyle.changeStyle(Style.MAPBOX_STREETS);
    }
});

运行效果图

在这里插入图片描述

标签:UiSettings,int,void,logoView,MapBox,Logo,Android,public
From: https://blog.csdn.net/kikikiki001/article/details/142591477

相关文章

  • Android拨号流程
    Android拨号流程是一个涉及多个组件和层级的复杂过程,从用户点击拨号按钮开始,直到电话被拨出并显示在通话界面上。以下是Android拨号流程的主要步骤:1.用户交互阶段用户通过Dialer应用(如Phone应用)的拨号界面输入电话号码,并点击拨号按钮。这一操作会触发DialpadFragment中的onClick事......
  • Android APK打渠道包实施方案
    最近刚好在做Android打渠道包相关的需求,记录下心得笔记,希望给有需要的朋友一个参考。首先,我们来理解下概念:1、母包(就是原始的安卓包)2、渠道标识(自定义的各个渠道标识,例如:baidu,xiaomi,uc等等)3、渠道包(在母包中打入了渠道标识之后,生成的新安卓包)其实就这3个东西,那么我们有了母包......
  • mapbox没有token/token失效,地图闪烁后变空白,报错Error: A valid Mapbox access token
    目录mapbox没有token/token失效,地图闪烁后空白,报错Error:AvalidMapboxaccesstokenisrequiredtouseMapboxGLJS.一、问题描述二、mapbox去除token验证1、找到mapbox-gl文件夹2、找到mapbox-gl.js文件3、找到对应位置并修改 4、清除缓存5、问题解决三、高阶......
  • Android 监听蓝牙耳机状态
    在Android中监听蓝牙耳机的状态,尤其是连接状态、播放控制按钮(如播放/暂停、上一曲、下一曲)等交互,通常涉及到几个关键步骤和组件。下面是一个概括指南,帮助你实现这个功能:1.获取蓝牙适配器并检查权限首先,确保应用具有访问蓝牙的权限。在AndroidManifest.xml中添加以下权限:<uses-per......
  • Android热更新实践:Tinker接入指南
    Android热更新实践:Tinker接入指南在Android开发中,热更新是一种非常有用的技术,它允许开发者在不发布新版本的情况下修复bug或更新应用内容。Tinker是腾讯开源的Android热更新框架,它提供了一套完整的热更新解决方案。本文将详细介绍如何将Tinker集成到你的Android项目中。1.准备工作......
  • Android平台RTMP推送模块的设计意义
    为什么要做RTMP推送RTMP是一种广泛使用的流媒体传输协议,它允许视频和音频数据在互联网上实时、高效地传输。实现RTMP推送功能,主要是为了满足以下需求:实时性要求:RTMP协议具有低延迟的特点,适合用于需要实时交互的场景,如直播、视频会议等。通过RTMP推送,观众可以几乎实时地观看到主播的......
  • uniapp - 详解安卓App打包后使用uni.chooseLocation地址列表一直加载转圈问题,Android
    前言网上的教程都无法解决问题,本文提供强力解决方案。在uni-app安卓App平台端开发中,详解uniApp打包成Android安卓后用chooseLocation打开地图选择位置空白卡住不动问题,选择地址列表什么也没有且一直处于加载状态(永远不会加载出来卡住了),另外点击搜索框后也无法搜索地点......
  • Android 10.0 Launcher3禁止改变density等系统密度导致布局变化hotseat靠右边显示功能
    1.前言在10.0的系统rom定制化开发中,在进行launcher3的定制化功能中,在有些项目修改系统密度density的值,以后导致launcher3的布局变乱,hotseat布局成一行竖屏显示看的很不美观,接下来就看如何分析解析禁止density改变导致布局变动的功能分析2.Launcher3禁止改变density等系统密......
  • Android应用程序启动与资源加载
    Android系统中的应用程序启动与资源加载详解在Android系统中,AMS(ActivityManagerService)扮演着核心角色,负责管理应用程序的生命周期和进程调度,包括启动应用进程等关键操作。下面将详细解析AMS启动应用进程时涉及的第一个线程、代码和资源的加载过程,以及R.id.xx的加载机制......
  • Android代码调试与调优指南
    Android代码调试与调优指南在Android应用开发中,代码调试与调优不仅是确保应用稳定运行、提升用户体验的必要环节,也是开发者专业技能的重要体现。随着Android系统版本的更新和硬件设备的多样化,开发者需要掌握更加全面和深入的调试与优化技术。一、深入理解Android架构与性......