diff options
author | Tobrun <tobrun.van.nuland@gmail.com> | 2018-07-12 20:05:40 +0200 |
---|---|---|
committer | Tobrun <tobrun@mapbox.com> | 2018-07-27 11:40:04 +0200 |
commit | 1be63108bb66f235bec3704a0df8b8145f3c49a1 (patch) | |
tree | 890cf2cd343d7a61230625fd769f9a8db6eb399a /platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps | |
parent | d61ad7b64243d0dc557d678512218e1f433f2349 (diff) | |
download | qtlocation-mapboxgl-1be63108bb66f235bec3704a0df8b8145f3c49a1.tar.gz |
[android] - wait for the initial render to occur before showing the map to the end-user
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps')
4 files changed, 75 insertions, 25 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 0fa1072cd2..aaed71ddec 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -3,6 +3,7 @@ package com.mapbox.mapboxsdk.maps; import android.content.Context; import android.graphics.Bitmap; import android.graphics.PointF; +import android.graphics.drawable.ColorDrawable; import android.opengl.GLSurfaceView; import android.os.Build; import android.os.Bundle; @@ -126,6 +127,11 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { // in IDE layout editor, just return return; } + + // hide surface until map is fully loaded #10990 + setForeground(new ColorDrawable(options.getForegroundLoadColor())); + addOnMapChangedListener(new InitialRenderCallback(this)); + mapboxMapOptions = options; // inflate view @@ -283,11 +289,12 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { } private void initialiseDrawingSurface(MapboxMapOptions options) { + String localFontFamily = options.getLocalIdeographFontFamily(); if (options.getTextureMode()) { TextureView textureView = new TextureView(getContext()); - String localFontFamily = options.getLocalIdeographFontFamily(); boolean translucentSurface = options.getTranslucentTextureSurface(); - mapRenderer = new TextureViewMapRenderer(getContext(), textureView, localFontFamily, translucentSurface) { + mapRenderer = new TextureViewMapRenderer(getContext(), + textureView, localFontFamily, translucentSurface) { @Override protected void onSurfaceCreated(GL10 gl, EGLConfig config) { MapView.this.onSurfaceCreated(); @@ -299,7 +306,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { } else { GLSurfaceView glSurfaceView = new GLSurfaceView(getContext()); glSurfaceView.setZOrderMediaOverlay(mapboxMapOptions.getRenderSurfaceOnTop()); - mapRenderer = new GLSurfaceViewMapRenderer(getContext(), glSurfaceView, options.getLocalIdeographFontFamily()) { + mapRenderer = new GLSurfaceViewMapRenderer(getContext(), glSurfaceView, localFontFamily) { @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { MapView.this.onSurfaceCreated(); @@ -981,6 +988,37 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { } } + /** + * The initial render callback waits for rendering to happen before making the map visible for end-users. + * We wait for the second DID_FINISH_RENDERING_FRAME map change event as the first will still show a black surface. + */ + private static class InitialRenderCallback implements OnMapChangedListener { + + private WeakReference<MapView> weakReference; + private int renderCount; + private boolean styleLoaded; + + InitialRenderCallback(MapView mapView) { + this.weakReference = new WeakReference<>(mapView); + } + + @Override + public void onMapChanged(int change) { + if (change == MapView.DID_FINISH_LOADING_STYLE) { + styleLoaded = true; + } else if (styleLoaded && change == MapView.DID_FINISH_RENDERING_FRAME) { + renderCount++; + if (renderCount == 2) { + MapView mapView = weakReference.get(); + if (mapView != null && !mapView.isDestroyed()) { + mapView.setForeground(null); + mapView.removeOnMapChangedListener(this); + } + } + } + } + } + private class GesturesManagerInteractionListener implements MapboxMap.OnGesturesManagerInteractionListener { @Override diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java index 02c50c9f18..0075199b1e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java @@ -30,6 +30,7 @@ import java.util.Arrays; */ public class MapboxMapOptions implements Parcelable { + private static final int LIGHT_GRAY = 0xFFF0E9E1; // RGB(240, 233, 225)) private static final float FOUR_DP = 4f; private static final float NINETY_TWO_DP = 92f; private static final int UNDEFINED_COLOR = -1; @@ -73,6 +74,9 @@ public class MapboxMapOptions implements Parcelable { private boolean textureMode; private boolean translucentTextureSurface; + @ColorInt + private int foregroundLoadColor; + private String style; private float pixelRatio; @@ -124,6 +128,7 @@ public class MapboxMapOptions implements Parcelable { zMediaOverlay = in.readByte() != 0; localIdeographFontFamily = in.readString(); pixelRatio = in.readFloat(); + foregroundLoadColor = in.readInt(); } /** @@ -209,7 +214,6 @@ public class MapboxMapOptions implements Parcelable { FOUR_DP * pxlRatio)), (int) (typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_uiAttributionMarginBottom, FOUR_DP * pxlRatio))}); - mapboxMapOptions.textureMode( typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_renderTextureMode, false)); mapboxMapOptions.translucentTextureSurface( @@ -222,6 +226,9 @@ public class MapboxMapOptions implements Parcelable { typedArray.getString(R.styleable.mapbox_MapView_mapbox_localIdeographFontFamily)); mapboxMapOptions.pixelRatio( typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_pixelRatio, 0)); + mapboxMapOptions.foregroundLoadColor( + typedArray.getInt(R.styleable.mapbox_MapView_mapbox_foregroundLoadColor, LIGHT_GRAY) + ); } finally { typedArray.recycle(); } @@ -522,6 +529,17 @@ public class MapboxMapOptions implements Parcelable { } /** + * Set the MapView foreground color that is used when the map surface is being created. + * + * @param loadColor the color to show during map creation + * @return This + */ + public MapboxMapOptions foregroundLoadColor(@ColorInt int loadColor) { + this.foregroundLoadColor = loadColor; + return this; + } + + /** * Enable tile pre-fetching. Loads tiles at a lower zoom-level to pre-render * a low resolution preview while more detailed tiles are loaded. * Enabled by default @@ -820,6 +838,16 @@ public class MapboxMapOptions implements Parcelable { } /** + * Returns the current configured foreground color that is used during map creation. + * + * @return the load color + */ + @ColorInt + public int getForegroundLoadColor() { + return foregroundLoadColor; + } + + /** * Returns the font-family for locally overriding generation of glyphs in the * 'CJK Unified Ideographs' and 'Hangul Syllables' ranges. * @@ -892,6 +920,7 @@ public class MapboxMapOptions implements Parcelable { dest.writeByte((byte) (zMediaOverlay ? 1 : 0)); dest.writeString(localIdeographFontFamily); dest.writeFloat(pixelRatio); + dest.writeInt(foregroundLoadColor); } @Override diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java index b05a8a407f..1129b8000e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java @@ -26,10 +26,10 @@ public abstract class MapRenderer implements MapRendererScheduler { private MapboxMap.OnFpsChangedListener onFpsChangedListener; public MapRenderer(Context context, String localIdeographFontFamily) { - FileSource fileSource = FileSource.getInstance(context); float pixelRatio = context.getResources().getDisplayMetrics().density; String programCacheDir = context.getCacheDir().getAbsolutePath(); + // Initialise native peer nativeInitialize(this, fileSource, pixelRatio, programCacheDir, localIdeographFontFamily); } @@ -65,24 +65,6 @@ public abstract class MapRenderer implements MapRendererScheduler { @CallSuper protected void onSurfaceChanged(GL10 gl, int width, int height) { - if (width < 0) { - throw new IllegalArgumentException("fbWidth cannot be negative."); - } - - if (height < 0) { - throw new IllegalArgumentException("fbHeight cannot be negative."); - } - - if (width > 65535) { - throw new IllegalArgumentException( - "fbWidth cannot be greater than 65535."); - } - - if (height > 65535) { - throw new IllegalArgumentException( - "fbHeight cannot be greater than 65535."); - } - gl.glViewport(0, 0, width, height); nativeOnSurfaceChanged(width, height); } @@ -140,5 +122,4 @@ public abstract class MapRenderer implements MapRendererScheduler { frames = 0; } } - } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java index b0667751bb..d27fadf5ca 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java @@ -21,7 +21,9 @@ public class GLSurfaceViewMapRenderer extends MapRenderer implements GLSurfaceVi private final GLSurfaceView glSurfaceView; - public GLSurfaceViewMapRenderer(Context context, GLSurfaceView glSurfaceView, String localIdeographFontFamily) { + public GLSurfaceViewMapRenderer(Context context, + GLSurfaceView glSurfaceView, + String localIdeographFontFamily) { super(context, localIdeographFontFamily); this.glSurfaceView = glSurfaceView; glSurfaceView.setEGLContextClientVersion(2); |