当前位置: 首页 > article >正文

MapBox Android版开发 6 关于Logo

MapBox Android版开发 6 关于Logo

  • Logo的显示
  • 查看源码及思路(Logo)
    • 第一步
    • 第二步
  • 隐藏Logo示例
  • 查看源码及思路(Info)
    • 第一步
    • 第二步
  • 隐藏Logo和Info示例

看到有网友留言问如何移除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);
    }
});

运行效果图

在这里插入图片描述


http://www.kler.cn/news/330407.html

相关文章:

  • 问:LINUXWINDOWS线程CPU时间如何排序?
  • MySQL(面试问题)
  • 计算机毕业设计 基于Hadoop的租房数据分析系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • YOLO11改进 | 卷积模块 | 添加选择性内核SKConv【附完整代码一键运行】
  • 什么是IDE(集成开发环境)?
  • 【51单片机】点亮LED之经典流水灯
  • 一键生成PPT的AI工具-Kimi!
  • Springboot + netty + rabbitmq + myBatis
  • oracle 新建用户,用户插入数据报错:ORA-01950: 对表空间 ‘USERS‘ 无权限
  • 23 vue3之详解scoped样式穿透vuecss新特性
  • Java面试题之JVM面试题
  • 2. 将GitHub上的开源项目导入(clone)到(Linux)服务器上——深度学习·科研实践·从0到1
  • 攻防世界----->easyre-153
  • 在PC端连接苹果手机(iPhone)时,即使已经开启了开发者模式(开发者权限),但仍然无法成功连接,是什么原因?
  • C++ 语言特性11 - 继承构造函数
  • 洞悉go.dev
  • 集师专属心理咨询 心理培训 心理知识服务小程序搭建 专属知识付费小程序搭建
  • VScode 自定义代码配色方案
  • 关于 Latex 使用 BibTeX 进行参考文献管理的相关
  • 数据资料安全治理新时代,AI/ML 来助力!