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() {
@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;
}
步骤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 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));
}
步骤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() {
@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);
}
});
运行效果图