From 267e33ba5a79358c44ab7cd9513e88f3646ca517 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Fri, 23 Oct 2015 16:30:29 +1100 Subject: [PATCH] [android] Add SpriteFactory.drawable for custom markers Used in InfoWindowAdapter activity Fixes #2744 --- .../mapboxsdk/annotations/Annotation.java | 12 ++++---- .../mapboxsdk/annotations/SpriteFactory.java | 28 +++++++++++++++++- .../testapp/InfoWindowAdapterActivity.java | 15 ++++++++++ .../ic_location_city_black_48dp.png | Bin 0 -> 172 bytes .../ic_location_city_black_48dp.png | Bin 0 -> 147 bytes .../ic_location_city_black_48dp.png | Bin 0 -> 190 bytes .../ic_location_city_black_48dp.png | Bin 0 -> 230 bytes .../ic_location_city_black_48dp.png | Bin 0 -> 255 bytes 8 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_location_city_black_48dp.png create mode 100644 android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_location_city_black_48dp.png create mode 100644 android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xhdpi/ic_location_city_black_48dp.png create mode 100644 android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_location_city_black_48dp.png create mode 100644 android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_location_city_black_48dp.png diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java index ec733510b..a83079ac4 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java @@ -4,8 +4,6 @@ import android.support.annotation.NonNull; import com.mapbox.mapboxsdk.views.MapView; -import java.lang.ref.WeakReference; - public abstract class Annotation implements Comparable { /** @@ -14,7 +12,7 @@ public abstract class Annotation implements Comparable { * Internal C++ id is stored as unsigned int. */ private long id = -1; // -1 unless added to a MapView - private WeakReference mapView; + private MapView mapView; protected Annotation() { } @@ -27,10 +25,10 @@ public abstract class Annotation implements Comparable { } public void remove() { - if ((mapView == null) || (mapView.get() == null)) { + if (mapView == null) { return; } - mapView.get().removeAnnotation(this); + mapView.removeAnnotation(this); } /** @@ -44,14 +42,14 @@ public abstract class Annotation implements Comparable { * Do not use this method. Used internally by the SDK. */ public void setMapView(MapView mapView) { - this.mapView = new WeakReference<>(mapView); + this.mapView = mapView; } protected MapView getMapView() { if (mapView == null) { return null; } - return mapView.get(); + return mapView; } @Override diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/SpriteFactory.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/SpriteFactory.java index ae07050ef..78f7673f8 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/SpriteFactory.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/SpriteFactory.java @@ -3,6 +3,9 @@ package com.mapbox.mapboxsdk.annotations; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.os.Build; import android.util.DisplayMetrics; import android.view.WindowManager; @@ -20,7 +23,6 @@ public final class SpriteFactory { private static final String SPRITE_ID_PREFIX = "com.mapbox.sprites.sprite_"; - // TODO make weak private MapView mMapView; private Sprite mDefaultMarker; private BitmapFactory.Options mOptions; @@ -62,6 +64,30 @@ public final class SpriteFactory { return new Sprite(id, bitmap); } + public Sprite fromDrawable(Drawable drawable) { + int width = drawable.getIntrinsicWidth(); + int height = drawable.getIntrinsicHeight(); + + return fromDrawable(drawable, width, height); + } + + + public Sprite fromDrawable(Drawable drawable, int width, int height) { + if ((width < 0) || (height < 0)) { + return null; + } + + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + Rect temp = drawable.getBounds(); + Rect bounds = new Rect(0, 0, width, height); + drawable.setBounds(bounds); + drawable.draw(canvas); + drawable.setBounds(temp); + + return fromBitmap(bitmap); + } + public Sprite fromResource(int resourceId) { Bitmap bitmap = BitmapFactory.decodeResource(mMapView.getResources(), resourceId); return fromBitmap(bitmap); diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivity.java b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivity.java index 62292811d..0a489edaa 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivity.java +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/InfoWindowAdapterActivity.java @@ -1,8 +1,11 @@ package com.mapbox.mapboxsdk.testapp; import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; @@ -12,6 +15,8 @@ import android.widget.TextView; import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.MarkerOptions; +import com.mapbox.mapboxsdk.annotations.Sprite; +import com.mapbox.mapboxsdk.annotations.SpriteFactory; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.utils.ApiAccess; @@ -20,6 +25,8 @@ import com.mapbox.mapboxsdk.views.MapView; public class InfoWindowAdapterActivity extends AppCompatActivity { private MapView mMapView; + private SpriteFactory mSpriteFactory; + private Drawable mIconDrawable; @Override protected void onCreate(Bundle savedInstanceState) { @@ -38,6 +45,10 @@ public class InfoWindowAdapterActivity extends AppCompatActivity { mMapView = (MapView) findViewById(R.id.mapView); mMapView.setAccessToken(ApiAccess.getToken(this)); mMapView.onCreate(savedInstanceState); + + mSpriteFactory = new SpriteFactory(mMapView); + mIconDrawable = ContextCompat.getDrawable(this, R.drawable.ic_location_city_black_48dp); + mMapView.setInfoWindowAdapter(new MapView.InfoWindowAdapter() { private int tenDp = (int) getResources().getDimension(R.dimen.attr_margin); @@ -66,6 +77,10 @@ public class InfoWindowAdapterActivity extends AppCompatActivity { marker.title(title); marker.snippet(color); marker.position(new LatLng(lat, lng)); + + mIconDrawable.setColorFilter(Color.parseColor(marker.getSnippet()), PorterDuff.Mode.SRC_IN); + Sprite icon = mSpriteFactory.fromDrawable(mIconDrawable); + marker.icon(icon); return marker; } diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_location_city_black_48dp.png b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_location_city_black_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c542d2aa76e543b44b79a822ebb7cf2b3460bce9 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhawialK%Ln;{GUfsyYWGLW#@OR1o z$^`9IA=-@-kFB?kHT0cy{LH_U%1cKr-(Na96AgV5_7i?tv#Xw+iD}oHHOx#*x8z^` z-3a9U@^f%-2!HWRUO{0&^gBfbg?veY3ER&cCq;7r literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_location_city_black_48dp.png b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_location_city_black_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..06853dd255bec8ecc6105ac360a42e51f7615adf GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DC{Gv1kP61PmkqfZ90Z&L`|Zr* zw|g$;5c|2{!{n^ldz_yCh&}UW(dX>)3qJ*J)NrK8DH-t#&D^t((IH{4Ha~|=Qzrwr vh*ki@yM&jIxqr;AVrRN{(3~-u%aXB3FW^DvtF&)GTNpfD{an^LB{Ts5rUEgV literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xhdpi/ic_location_city_black_48dp.png b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xhdpi/ic_location_city_black_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5fd9a19d1190a5474a92186aa5c0043e7fd475 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeG3?%1&o4*=JaR&H=xB_ViXik240LWr03GxeO zXqc_-CjsOodAc};R4~4sxKOacfrsT_jo`|*svut1gu2x!i{c6dIb3GEIdgPP#KgDl zZ`_rR&E(iE^w8L|p^xW+AhT@Y3{NL_wig|ZeHJe`j%aa<9d*^oEBv@%Rma+Bzc2Q7 df`9wXP0a6IHhunx<*P5q6`rnsF6*2UngFo+KQRCR literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_location_city_black_48dp.png b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_location_city_black_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0b2b64745d0251c3a403a611a1314e738137fc1b GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^6F``W8A#63;L-+CoB=)|u0R?Bnv-810J4}$g8YIR z8fI(zNdS3Wo-U3d6^w5uZ{$2|Ai_G;t=0X6$xQdl87!iiCBbYxTFpDJalPmI*rm;P zME_xbMQvAbb>Y4HkG4eGaN4YL`mXX}1>5DxA69T(usyk0>cAJ3-c@r-{5P#QcJhl# z=c)&R>^)!IZaG`+5Xw}})G6()UE;C5$D@Dxu^|0qX3a@81xxP4g3xiHL;M-5e&+ms R&8Y`+t*5J>%Q~loCIHbxRYCv& literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_location_city_black_48dp.png b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_location_city_black_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f9654a9a670c1e6b287df17dc143f1c6b71d2f99 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvK8A$4HYMBD0I0Jk_T!AzMG$+420Aw+h1o;Is zG|blalK}D-d%8G=RK&f#vXPV7P=Gbi`lix4sq34s<_P+236(13V7IeSGtQ_}Qq`Z4 zBEP-(oNc^-i(|na#S@IeyCPjm#Jyjn3Es3#VCwGR>{8v(F(+XGi!OG^LAo!7$Rmj1mY;%X?hI_J&4j064OLDMqulv8xL1D*zKL>?~53lx1 s3UKU^VrmR`R`|fdQK$Cfu;ueR?3PQe&(t@L0C|kT)78&qol`;+0IwxbqW}N^ literal 0 HcmV?d00001