From 028ef7a32356ffce8ba66b203016445e02637644 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Thu, 21 Apr 2016 10:50:01 +0200 Subject: [PATCH] [android] #3276 - WIP Android View Annotations, showing an Android SDK view on the screen --- .../mapbox/mapboxsdk/annotations/Marker.java | 19 +++ .../mapboxsdk/annotations/MarkerView.java | 69 ++++++++++ .../com/mapbox/mapboxsdk/maps/MapView.java | 6 + .../com/mapbox/mapboxsdk/maps/MapboxMap.java | 47 +++++++ .../src/main/AndroidManifest.xml | 10 ++ .../annotation/ViewMarkerActivity.java | 123 ++++++++++++++++++ .../testapp/view/CustomMarkerView.java | 36 +++++ .../main/res/drawable-xxhdpi/ic_brazil.png | Bin 0 -> 2178 bytes .../src/main/res/drawable-xxhdpi/ic_china.png | Bin 0 -> 745 bytes .../main/res/drawable-xxhdpi/ic_germany.png | Bin 0 -> 168 bytes .../src/main/res/drawable-xxhdpi/ic_us.png | Bin 0 -> 323 bytes .../main/res/layout/activity_marker_view.xml | 58 +++++++++ .../main/res/layout/view_custom_marker.xml | 19 +++ .../src/main/res/values/ids.xml | 1 + .../src/main/res/values/strings.xml | 4 +- 15 files changed, 391 insertions(+), 1 deletion(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/view/CustomMarkerView.java create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_brazil.png create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_china.png create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_germany.png create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_us.png create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_marker_view.xml create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_custom_marker.xml diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java index 8a6ff519a..9b7e7eb1a 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java @@ -16,6 +16,8 @@ import com.mapbox.mapboxsdk.maps.MapView; */ public class Marker extends Annotation { + private MarkerView markerView; + private LatLng position; private String snippet; private Icon icon; @@ -78,6 +80,10 @@ public class Marker extends Annotation { if (map != null) { map.updateMarker(this); } + + if(markerView!=null){ + markerView.setLatLng(position); + } } void setSnippet(String snippet) { @@ -141,6 +147,19 @@ public class Marker extends Annotation { return infoWindow; } + public MarkerView getMarkerView() { + return markerView; + } + + void setMarkerView(MarkerView markerView) { + MapboxMap map = getMapboxMap(); + if (map != null) { + this.markerView = markerView; + this.markerView.setLatLng(position); + map.addMarkerView(markerView); + } + } + /** * Do not use this method. Used internally by the SDK. */ diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java new file mode 100644 index 000000000..3e9d12034 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java @@ -0,0 +1,69 @@ +package com.mapbox.mapboxsdk.annotations; + +import android.content.Context; +import android.graphics.PointF; +import android.util.AttributeSet; +import android.util.Log; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import com.mapbox.mapboxsdk.constants.MapboxConstants; +import com.mapbox.mapboxsdk.geometry.LatLng; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.Projection; + +public class MarkerView extends FrameLayout { + + private LatLng latLng; + private Projection projection; + private Marker marker; + + private float widthOffset; + private float heightOffset; + + public MarkerView(Context context) { + super(context); + init(context); + } + + public MarkerView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public MarkerView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + private void init(Context context){ + setLayoutParams(new MapView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } + + public void setProjection(Projection projection) { + this.projection = projection; + } + + public void setLatLng(LatLng latLng) { + this.latLng = latLng; + } + + public void setMarker(Marker marker) { + this.marker = marker; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + widthOffset = getMeasuredWidth() / 2; + heightOffset = getMeasuredHeight() / 2; + + Log.v(MapboxConstants.TAG,"Measure "+widthOffset + heightOffset); + } + + public void update() { + PointF point = projection.toScreenLocation(latLng); + setX(point.x - widthOffset); + setY(point.y - heightOffset); + } +} 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 be4819064..960b478f9 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 @@ -65,6 +65,7 @@ import com.mapbox.mapboxsdk.annotations.Icon; import com.mapbox.mapboxsdk.annotations.IconFactory; import com.mapbox.mapboxsdk.annotations.InfoWindow; import com.mapbox.mapboxsdk.annotations.Marker; +import com.mapbox.mapboxsdk.annotations.MarkerView; import com.mapbox.mapboxsdk.annotations.Polygon; import com.mapbox.mapboxsdk.annotations.Polyline; import com.mapbox.mapboxsdk.camera.CameraPosition; @@ -1319,6 +1320,11 @@ public class MapView extends FrameLayout { mCompassView.update(getDirection()); mMyLocationView.update(); + + for (MarkerView view : mMapboxMap.getMarkerViews()) { + view.update(); + } + for (InfoWindow infoWindow : mMapboxMap.getInfoWindows()) { infoWindow.update(); } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 0e763a998..b12371b3a 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -20,6 +20,7 @@ import com.mapbox.mapboxsdk.annotations.Icon; import com.mapbox.mapboxsdk.annotations.InfoWindow; import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.MarkerOptions; +import com.mapbox.mapboxsdk.annotations.MarkerView; import com.mapbox.mapboxsdk.annotations.Polygon; import com.mapbox.mapboxsdk.annotations.PolygonOptions; import com.mapbox.mapboxsdk.annotations.Polyline; @@ -58,9 +59,13 @@ public class MapboxMap { private CameraPosition mCameraPosition; private boolean mInvalidCameraPosition; private LongSparseArray mAnnotations; + private List mSelectedMarkers; + private List mMarkerViews; private List mInfoWindows; + private MapboxMap.InfoWindowAdapter mInfoWindowAdapter; + private MapboxMap.MarkerViewAdapter mMarkerViewAdapter; private boolean mMyLocationEnabled; private boolean mAllowConcurrentMultipleInfoWindows; @@ -89,6 +94,7 @@ public class MapboxMap { mProjection = new Projection(mapView); mAnnotations = new LongSparseArray<>(); mSelectedMarkers = new ArrayList<>(); + mMarkerViews = new ArrayList<>(); mInfoWindows = new ArrayList<>(); } @@ -613,6 +619,12 @@ public class MapboxMap { // Annotations // + public void addMarkerView(MarkerView markerView){ + markerView.setProjection(mProjection); + mMarkerViews.add(markerView); + mMapView.addView(markerView); + } + /** *

* Adds a marker to this map. @@ -643,6 +655,14 @@ public class MapboxMap { @NonNull public Marker addMarker(@NonNull BaseMarkerOptions markerOptions) { Marker marker = prepareMarker(markerOptions); + + if(mMarkerViewAdapter!=null){ + MarkerView view = mMarkerViewAdapter.getView(marker); + if(view!=null) { + mMarkerViews.add(view); + } + } + long id = mMapView.addMarker(marker); marker.setMapboxMap(this); marker.setId(id); @@ -1001,6 +1021,18 @@ public class MapboxMap { return markers; } + @Nullable + public MarkerView getMarkerView(long id) { + MarkerView markerView = null; + List markers = getMarkers(); + for (Marker m : markers) { + if (m.getId() == id) { + markerView = m.getMarkerView(); + } + } + return markerView; + } + /** * Returns a list of all the polygons on the map. * @@ -1133,6 +1165,10 @@ public class MapboxMap { return marker; } + public void setMarkerViewAdapter(@Nullable MarkerViewAdapter markerViewAdapter){ + mMarkerViewAdapter = markerViewAdapter; + } + // // InfoWindow // @@ -1188,6 +1224,11 @@ public class MapboxMap { return mInfoWindows; } + // used by MapView + List getMarkerViews(){ + return mMarkerViews; + } + private boolean isInfoWindowValidForMarker(@NonNull Marker marker) { return !TextUtils.isEmpty(marker.getTitle()) || !TextUtils.isEmpty(marker.getSnippet()); } @@ -1715,6 +1756,12 @@ public class MapboxMap { View getInfoWindow(@NonNull Marker marker); } + public interface MarkerViewAdapter { + + @Nullable + MarkerView getView(@NonNull Marker marker); + } + /** * Interface definition for a callback to be invoked when the the My Location view changes location. * diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index 541164384..d31915f21 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -253,6 +253,16 @@ android:value="@string/category_maplayout" /> + + + + + Yz;->X zc0LPh3U)kn02FE=E0~Un??<8G_;8#%;fyICMDla|yFm@0Ko7^A8f1Usi(3sAK%4FX#^014nU!f4}R9KB5?2zJcQ{h`hQbN7bxzvaIf6aZ*O z-HWE--6NyXZZOWc3~lt;-Xuhuc#eJ7LGfXQCp>pg9nfqTcmUgVytu{f3&G`6c6^5K zP~dZl-^y_Fv?XrT*y6@9TYk*WvG4fbQ2e>x7O(6J7O$gwng9qzE}(caN-O1^>zobl z-zTkcI8Ti?7S6`=k&6(mT!!d?Wq5AfA|x-Ei%)Vx@Lipa0I5*`QC{T^Rq>>LFOmZT zfM(o+9y0MjApUmRnh&78QJC?nw*oOUVllj(GI%Il)1e%h2BljXKW68=oHC&gdljE< zQ3EYh8^mn*=8P3m4k|IMFt*<$vws1I(l+jw6L8{~tB~#nah;!&AunEovCgaE=aLTf zs5g2IBaH0DTC_I{*SI4V$@&@>E}#984gCjzX2fpCv)J&lAHF|p$y2wrK?pYUTb9OP zwEY?cxu@QD@Wu#|r}E$AEQ#fr&}!%^k~bSHkwY@-zzkG@{xJd&XI;Bz99m8|3F+QV z+SuTa$Z#8aG}-- zGf7q-Rx%$A01bTPt{4;?_Ci}XX)^{p_aCYOuPsQ2K4vQx&fAKY=5ND`v$tZ7HV^u! z97OqKLP0PT4l6hm<;ayBis^D#h1lTN@m;MAZkyeM-IKv6`g9EBB(o1HnGXj*l(vN> zq4?uTdp;9w4WL%kEq?OrkOz{?2M0ieecp}6 z{-dM1S=gR~Y57O*Bx8BPek_jLg%_r8!CYNF=Fi%KS6<$Z)RlXX`_{*(GyD$qSHD2z z*Nv#UcnNrFxHX__B9ez%UJk41R@O4atk3#}{?GvGNT?uX2CM;W0 zjH1$N9J_W7WtUH5ZGH(R2d(2E6fS9)5xxXB>n%GSV^7g4W&@Mo1d?GU$Gv4kp8-UW zv@!W%7w<6K`vE$AJ=5*uHi%Kh)5B9Sb5H3^=U|Uigm`wTfl8i&0GerUyXBbVzYepe z0Q4>uP&$o9}o34zWnGo#y!W$3HrNNV-TfZCQ=l z-e&+oOS#c84pc=TqWm(b0A_a3s37b)PumY#PKaaOdD)C%YI<8jO z_6dN|Gn^-tnEXLh|11GZN~dIUVt*$`)|Vyl-?J8&9r<%!#o3HU`eyLY?y|=+V-lr# zwCYWhEa4z%xdaYRL45pfR9*QTr!Q9E7TM_D?rU5E-_kRtl?K47Ft&e|KzDy1NCl>h zyg4s|y<`Kc*v#)UM>l6$J|-&H^7Ie(=o);KB9pK4@${()&$>$jS!VdyC1RGQ0GC?c z!=2{)7r~>|ZU}y_Z~KNvkU<@OM!U4HNP6xigA71ft{P!JIeaio<5}uQDl$xFn=J_e zjHydxFk-^8Fk|9oDBZJAvNpuT44KQ|6)Mh)_p1d%G+;7lCW#(JQ&CKN{5w4uA!b_s zMJcNdc@=)N4A`J%PRd1ucRH!UD!vpLl-OrBLPubjKw9{-71ES2^H%r2{F36+g$DqRm3OU$3{O{f9~z^Z>j$`cd2BOs4i8_24aUW07Q1 z$p*{fcB84Z9jKJUr&HRrgXhJ_e3C6DU*?i&G&EnHw8u*&p~8$0ninHxlIglD23yO= zl6UWVHO64D?vmR>batN7m!o>bkes#9j_r$DN9guEBNjQ`(0V;?M`p&J8JZ#WdR+Pk z2?>A%;E4nv{imn|Kms5EkN`*kBmfcs34jDZ0x+cF|5-OvchCazpa1{>07*qoM6N<$ Ef<3|z(f|Me literal 0 HcmV?d00001 diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_china.png b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_china.png new file mode 100644 index 0000000000000000000000000000000000000000..d75026aac00d6bf384e053d080af826b4d3a32f7 GIT binary patch literal 745 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVA|m6;uunK>+LM>Y~etW>a}5~$Bx>)Ke~U%vHjzO!rjy)=oY@_9v*nHFq1eC*X+O_TTjpLVTh>6`hZ z$gr&y}o==7xSKEbI%7_o)1_&A7sR+2skSIT@|s{ zn$@I=;li%U{7L@IX1fyAJ#>5xez7jkt=YSg_lHxa-O)|QUQeBESu^--Xw_#d*!P*KI$v z;_KC)>-!Gq&1E{paX08rUQ^%JmjQ>X&rQe-xXW|$XXx^Z&8-iVo-E0g(qVVkn*aZ4 zOaI}{d2H@%6Ru<^9grFu1lr(aLz2Q$Vx`Kv~qxxF!JKN-? R3+)+zz|+;wWt~$(69A);O(*~W literal 0 HcmV?d00001 diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_germany.png b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_germany.png new file mode 100644 index 0000000000000000000000000000000000000000..07707aa0ff7eb7a345461b7fb9f04c952c8e4a50 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=`JOJ0Ar-gY-ZEr7;J|Za!{h$7 zbN)Cdx-@fUd|MTp2UGzAGVC|5EroHw^n?7@At(X?YxC!VY(oMPs*DKUj%&;-83ou6 SeN}h^67+QSb6Mw<&;$U^3M7O8 literal 0 HcmV?d00001 diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_us.png b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_us.png new file mode 100644 index 0000000000000000000000000000000000000000..57f3cbe65451f9d3e4f5d7bc8dc01f8ead84f447 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVC3?2aSW-r_4bA>SF?ja+rzgy zW!wjuT|#VHp7Sh;y0oOXL;bRF&B~+`@yp*F+H=Sx_~qkw=BxcCZH`$cF9$RR4pg4s ziPZEuw{&GZgQ836U6uEb%bM@WU*=YP#(rVjVwIJd%igy6FaNE$ci;Ta%pdGlt#fY` z2%Q$b_3e^XyJRm_uj^{L{+~yqtGg}n+OB=~?%ms~%Ur}{u%GEfgNU|*dc%31h-vR@ z_k`=8E@qINpu{|bNpe2(35M+81`uBX$gko4;I6SdpK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_custom_marker.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_custom_marker.xml new file mode 100644 index 000000000..08caf1df6 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_custom_marker.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/ids.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/ids.xml index 9b316d0c3..120bf49fc 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/ids.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/ids.xml @@ -4,6 +4,7 @@ + diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml index 835b1479f..840427af0 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml @@ -17,7 +17,8 @@ Polyline Polygon Press Map For Marker - + x + Standard InfoWindow example Custom InfoWindow Adapter @@ -76,6 +77,7 @@ Scroll with pixels in x,y direction Example to make a snapshot of the map 2 maps in a view hierarchy + x Concurrent Open InfoWindowsr Dismiss location tracking on gesture