diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java')
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java | 90 |
1 files changed, 79 insertions, 11 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java index 49c39e94b3..14fc69f456 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Style.java @@ -1,10 +1,12 @@ package com.mapbox.mapboxsdk.maps; import android.graphics.Bitmap; +import android.os.AsyncTask; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringDef; +import android.util.DisplayMetrics; import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.style.layers.Layer; import com.mapbox.mapboxsdk.style.layers.TransitionOptions; @@ -13,6 +15,8 @@ import com.mapbox.mapboxsdk.style.sources.Source; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.ref.WeakReference; +import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -26,6 +30,7 @@ import java.util.Map; * has been loaded by underlying map. * </p> */ +@SuppressWarnings("unchecked") public class Style { private final NativeMap nativeMap; @@ -38,7 +43,7 @@ public class Style { /** * Private constructor to build a style object. * - * @param builder the builder used for creating this style + * @param builder the builder used for creating this style * @param nativeMap the map object used to load this style */ private Style(@NonNull Builder builder, @NonNull NativeMap nativeMap) { @@ -296,21 +301,28 @@ public class Style { /** * Adds an image to be used in the map's style * - * @param name the name of the image - * @param image the pre-multiplied Bitmap - * @param sdf the flag indicating image is an SDF or template image + * @param name the name of the image + * @param bitmap the pre-multiplied Bitmap + * @param sdf the flag indicating image is an SDF or template image */ - public void addImage(@NonNull String name, @NonNull Bitmap image, boolean sdf) { + public void addImage(@NonNull final String name, @NonNull final Bitmap bitmap, boolean sdf) { validateState("addImage"); - nativeMap.addImage(name, image, sdf); + new BitmapImageConversionTask(nativeMap, sdf).execute(new Builder.ImageWrapper(name, bitmap, sdf)); } /** * Adds an images to be used in the map's style. */ public void addImages(@NonNull HashMap<String, Bitmap> images) { + addImages(images, false); + } + + /** + * Adds an images to be used in the map's style. + */ + public void addImages(@NonNull HashMap<String, Bitmap> images, boolean sdf) { validateState("addImages"); - nativeMap.addImages(images); + new BitmapImageConversionTask(nativeMap, sdf).execute(Builder.ImageWrapper.convertToImageArray(images, sdf)); } /** @@ -349,8 +361,7 @@ public class Style { */ public void setTransition(@NonNull TransitionOptions transitionOptions) { validateState("setTransition"); - nativeMap.setTransitionDuration(transitionOptions.getDuration()); - nativeMap.setTransitionDelay(transitionOptions.getDelay()); + nativeMap.setTransitionOptions(transitionOptions); } /** @@ -364,7 +375,7 @@ public class Style { @NonNull public TransitionOptions getTransition() { validateState("getTransition"); - return new TransitionOptions(nativeMap.getTransitionDuration(), nativeMap.getTransitionDelay()); + return nativeMap.getTransitionOptions(); } // @@ -675,7 +686,7 @@ public class Style { return new Style(this, nativeMap); } - class ImageWrapper { + static class ImageWrapper { Bitmap bitmap; String id; boolean sdf; @@ -685,6 +696,16 @@ public class Style { this.bitmap = bitmap; this.sdf = sdf; } + + static ImageWrapper[] convertToImageArray(HashMap<String, Bitmap> bitmapHashMap, boolean sdf) { + ImageWrapper[] images = new ImageWrapper[bitmapHashMap.size()]; + List<String> keyList = new ArrayList<>(bitmapHashMap.keySet()); + for (int i = 0; i < bitmapHashMap.size(); i++) { + String id = keyList.get(i); + images[i] = new ImageWrapper(id, bitmapHashMap.get(id), sdf); + } + return images; + } } class LayerWrapper { @@ -723,6 +744,53 @@ public class Style { } } + private static class BitmapImageConversionTask extends AsyncTask<Builder.ImageWrapper, Void, List<Image>> { + + private WeakReference<NativeMap> nativeMap; + private boolean sdf; + + BitmapImageConversionTask(NativeMap nativeMap, boolean sdf) { + this.nativeMap = new WeakReference<>(nativeMap); + this.sdf = sdf; + } + + @NonNull + @Override + protected List<Image> doInBackground(Builder.ImageWrapper... params) { + List<Image> images = new ArrayList<>(); + ByteBuffer buffer; + String name; + Bitmap bitmap; + + for (Builder.ImageWrapper param : params) { + name = param.id; + bitmap = param.bitmap; + + if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) { + bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false); + } + + buffer = ByteBuffer.allocate(bitmap.getByteCount()); + bitmap.copyPixelsToBuffer(buffer); + + float pixelRatio = (float) bitmap.getDensity() / DisplayMetrics.DENSITY_DEFAULT; + + images.add(new Image(buffer.array(), pixelRatio, name, bitmap.getWidth(), bitmap.getHeight(), sdf)); + } + + return images; + } + + @Override + protected void onPostExecute(@NonNull List<Image> images) { + super.onPostExecute(images); + NativeMap nativeMap = this.nativeMap.get(); + if (nativeMap != null && !nativeMap.isDestroyed()) { + nativeMap.addImages(images.toArray(new Image[images.size()])); + } + } + } + /** * Callback to be invoked when a style has finished loading. */ |