[android] - translucent surface on TextureView
This commit is contained in:
@@ -294,7 +294,9 @@ public class MapView extends FrameLayout {
|
||||
private void initialiseDrawingSurface(MapboxMapOptions options) {
|
||||
if (options.getTextureMode()) {
|
||||
TextureView textureView = new TextureView(getContext());
|
||||
mapRenderer = new TextureViewMapRenderer(getContext(), textureView, options.getLocalIdeographFontFamily()) {
|
||||
String localFontFamily = options.getLocalIdeographFontFamily();
|
||||
boolean translucentSurface = options.getTranslucentTextureSurface();
|
||||
mapRenderer = new TextureViewMapRenderer(getContext(), textureView, localFontFamily, translucentSurface) {
|
||||
@Override
|
||||
protected void onSurfaceCreated(GL10 gl, EGLConfig config) {
|
||||
MapView.this.onSurfaceCreated();
|
||||
|
||||
@@ -87,6 +87,7 @@ public class MapboxMapOptions implements Parcelable {
|
||||
private String apiBaseUrl;
|
||||
|
||||
private boolean textureMode;
|
||||
private boolean translucentTextureSurface;
|
||||
|
||||
private String style;
|
||||
|
||||
@@ -156,6 +157,7 @@ public class MapboxMapOptions implements Parcelable {
|
||||
style = in.readString();
|
||||
apiBaseUrl = in.readString();
|
||||
textureMode = in.readByte() != 0;
|
||||
translucentTextureSurface = in.readByte() != 0;
|
||||
prefetchesTiles = in.readByte() != 0;
|
||||
zMediaOverlay = in.readByte() != 0;
|
||||
localIdeographFontFamily = in.readString();
|
||||
@@ -289,6 +291,8 @@ public class MapboxMapOptions implements Parcelable {
|
||||
typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_myLocationAccuracyThreshold, 0));
|
||||
mapboxMapOptions.textureMode(
|
||||
typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_renderTextureMode, false));
|
||||
mapboxMapOptions.translucentTextureSurface(
|
||||
typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_renderTextureTranslucentSurface, false));
|
||||
mapboxMapOptions.setPrefetchesTiles(
|
||||
typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_enableTilePrefetch, true));
|
||||
mapboxMapOptions.renderSurfaceOnTop(
|
||||
@@ -711,6 +715,11 @@ public class MapboxMapOptions implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
public MapboxMapOptions translucentTextureSurface(boolean translucentTextureSurface) {
|
||||
this.translucentTextureSurface = translucentTextureSurface;
|
||||
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.
|
||||
@@ -1085,6 +1094,10 @@ public class MapboxMapOptions implements Parcelable {
|
||||
return textureMode;
|
||||
}
|
||||
|
||||
public boolean getTranslucentTextureSurface() {
|
||||
return translucentTextureSurface;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the font-family for locally overriding generation of glyphs in the
|
||||
* ‘CJK Unified Ideographs’ and ‘Hangul Syllables’ ranges.
|
||||
@@ -1159,6 +1172,7 @@ public class MapboxMapOptions implements Parcelable {
|
||||
dest.writeString(style);
|
||||
dest.writeString(apiBaseUrl);
|
||||
dest.writeByte((byte) (textureMode ? 1 : 0));
|
||||
dest.writeByte((byte) (translucentTextureSurface ? 1 : 0));
|
||||
dest.writeByte((byte) (prefetchesTiles ? 1 : 0));
|
||||
dest.writeByte((byte) (zMediaOverlay ? 1 : 0));
|
||||
dest.writeString(localIdeographFontFamily);
|
||||
@@ -1340,6 +1354,7 @@ public class MapboxMapOptions implements Parcelable {
|
||||
? Float.floatToIntBits(myLocationAccuracyThreshold) : 0);
|
||||
result = 31 * result + (apiBaseUrl != null ? apiBaseUrl.hashCode() : 0);
|
||||
result = 31 * result + (textureMode ? 1 : 0);
|
||||
result = 31 * result + (translucentTextureSurface ? 1 : 0);
|
||||
result = 31 * result + (style != null ? style.hashCode() : 0);
|
||||
result = 31 * result + (prefetchesTiles ? 1 : 0);
|
||||
result = 31 * result + (zMediaOverlay ? 1 : 0);
|
||||
|
||||
@@ -54,6 +54,17 @@ public class EGLConfigChooser implements GLSurfaceView.EGLConfigChooser {
|
||||
@SuppressWarnings("JavadocReference")
|
||||
private static final int EGL_OPENGL_ES2_BIT = 0x0004;
|
||||
|
||||
private boolean translucentSurface;
|
||||
|
||||
public EGLConfigChooser() {
|
||||
this(false);
|
||||
}
|
||||
|
||||
public EGLConfigChooser(boolean translucentSurface) {
|
||||
super();
|
||||
this.translucentSurface = translucentSurface;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
|
||||
int[] configAttribs = getConfigAttributes();
|
||||
@@ -274,7 +285,7 @@ public class EGLConfigChooser implements GLSurfaceView.EGLConfigChooser {
|
||||
EGL_RED_SIZE, 5,
|
||||
EGL_GREEN_SIZE, 6,
|
||||
EGL_BLUE_SIZE, 5,
|
||||
EGL_ALPHA_SIZE, 0,
|
||||
EGL_ALPHA_SIZE, translucentSurface ? 8 : 0,
|
||||
EGL_DEPTH_SIZE, 16,
|
||||
EGL_STENCIL_SIZE, 8,
|
||||
(emulator ? EGL_NONE : EGL_CONFORMANT), EGL_OPENGL_ES2_BIT,
|
||||
|
||||
@@ -17,17 +17,22 @@ import javax.microedition.khronos.opengles.GL10;
|
||||
*/
|
||||
public class TextureViewMapRenderer extends MapRenderer {
|
||||
private TextureViewRenderThread renderThread;
|
||||
private boolean translucentSurface;
|
||||
|
||||
/**
|
||||
* Create a {@link MapRenderer} for the given {@link TextureView}
|
||||
*
|
||||
* @param context the current Context
|
||||
* @param textureView the TextureView
|
||||
* @param context the current Context
|
||||
* @param textureView the TextureView
|
||||
* @param localIdeographFontFamily the local font family
|
||||
* @param translucentSurface the translucency flag
|
||||
*/
|
||||
public TextureViewMapRenderer(@NonNull Context context,
|
||||
@NonNull TextureView textureView,
|
||||
String localIdeographFontFamily) {
|
||||
String localIdeographFontFamily,
|
||||
boolean translucentSurface) {
|
||||
super(context, localIdeographFontFamily);
|
||||
this.translucentSurface = translucentSurface;
|
||||
renderThread = new TextureViewRenderThread(textureView, this);
|
||||
renderThread.start();
|
||||
}
|
||||
@@ -95,4 +100,8 @@ public class TextureViewMapRenderer extends MapRenderer {
|
||||
public void onDestroy() {
|
||||
renderThread.onDestroy();
|
||||
}
|
||||
|
||||
public boolean isTranslucentSurface() {
|
||||
return translucentSurface;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,9 +53,10 @@ class TextureViewRenderThread extends Thread implements TextureView.SurfaceTextu
|
||||
*/
|
||||
@UiThread
|
||||
TextureViewRenderThread(@NonNull TextureView textureView, @NonNull TextureViewMapRenderer mapRenderer) {
|
||||
textureView.setOpaque(!mapRenderer.isTranslucentSurface());
|
||||
textureView.setSurfaceTextureListener(this);
|
||||
this.mapRenderer = mapRenderer;
|
||||
this.eglHolder = new EGLHolder(new WeakReference<>(textureView));
|
||||
this.eglHolder = new EGLHolder(new WeakReference<>(textureView), mapRenderer.isTranslucentSurface());
|
||||
}
|
||||
|
||||
// SurfaceTextureListener methods
|
||||
@@ -324,6 +325,7 @@ class TextureViewRenderThread extends Thread implements TextureView.SurfaceTextu
|
||||
private static class EGLHolder {
|
||||
private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
|
||||
private final WeakReference<TextureView> textureViewWeakRef;
|
||||
private boolean translucentSurface;
|
||||
|
||||
private EGL10 egl;
|
||||
private EGLConfig eglConfig;
|
||||
@@ -331,8 +333,9 @@ class TextureViewRenderThread extends Thread implements TextureView.SurfaceTextu
|
||||
private EGLContext eglContext = EGL10.EGL_NO_CONTEXT;
|
||||
private EGLSurface eglSurface = EGL10.EGL_NO_SURFACE;
|
||||
|
||||
EGLHolder(WeakReference<TextureView> textureViewWeakRef) {
|
||||
EGLHolder(WeakReference<TextureView> textureViewWeakRef, boolean translucentSurface) {
|
||||
this.textureViewWeakRef = textureViewWeakRef;
|
||||
this.translucentSurface = translucentSurface;
|
||||
}
|
||||
|
||||
void prepare() {
|
||||
@@ -357,7 +360,7 @@ class TextureViewRenderThread extends Thread implements TextureView.SurfaceTextu
|
||||
eglConfig = null;
|
||||
eglContext = EGL10.EGL_NO_CONTEXT;
|
||||
} else if (eglContext == EGL10.EGL_NO_CONTEXT) {
|
||||
eglConfig = new EGLConfigChooser().chooseConfig(egl, eglDisplay);
|
||||
eglConfig = new EGLConfigChooser(translucentSurface).chooseConfig(egl, eglDisplay);
|
||||
int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE};
|
||||
eglContext = egl.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user