summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobrun <tobrun@mapbox.com>2016-05-03 08:15:15 +0200
committerTobrun <tobrun@mapbox.com>2016-05-20 12:00:01 +0200
commit16a2765adcc726feaffbc2e6f7e805d9e5d6cf58 (patch)
treec8ede33c621b227d77e8ac22617a54cf1631848f
parent1d912a409a61531cca909d94838c0f177ba1f9e8 (diff)
downloadqtlocation-mapboxgl-16a2765adcc726feaffbc2e6f7e805d9e5d6cf58.tar.gz
[android] #3276 - android view annotations adapter approach
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java19
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java69
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java100
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java64
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java9
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java83
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarker.java24
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerOptions.java75
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/view/CustomMarkerView.java36
9 files changed, 268 insertions, 211 deletions
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 9b7e7eb1ac..8a6ff519ad 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,8 +16,6 @@ import com.mapbox.mapboxsdk.maps.MapView;
*/
public class Marker extends Annotation {
- private MarkerView markerView;
-
private LatLng position;
private String snippet;
private Icon icon;
@@ -80,10 +78,6 @@ public class Marker extends Annotation {
if (map != null) {
map.updateMarker(this);
}
-
- if(markerView!=null){
- markerView.setLatLng(position);
- }
}
void setSnippet(String snippet) {
@@ -147,19 +141,6 @@ 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
deleted file mode 100644
index 3e9d120343..0000000000
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java
+++ /dev/null
@@ -1,69 +0,0 @@
-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 406f9b27de..57a780a936 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
@@ -23,6 +23,7 @@ import android.location.Location;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.FloatRange;
@@ -31,6 +32,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import android.support.v4.content.ContextCompat;
+import android.support.v4.util.LongSparseArray;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v4.view.ScaleGestureDetectorCompat;
import android.support.v7.app.AlertDialog;
@@ -65,7 +67,6 @@ 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;
@@ -86,6 +87,7 @@ import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings;
import com.mapbox.mapboxsdk.telemetry.MapboxEvent;
import com.mapbox.mapboxsdk.telemetry.MapboxEventManager;
import com.mapbox.mapboxsdk.utils.ColorUtils;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.nio.ByteBuffer;
@@ -109,7 +111,6 @@ import java.util.concurrent.CopyOnWriteArrayList;
* </p>
* <strong>Warning:</strong> Please note that you are responsible for getting permission to use the map data,
* and for ensuring your use adheres to the relevant terms of use.
- *
*/
public class MapView extends FrameLayout {
@@ -244,6 +245,8 @@ public class MapView extends FrameLayout {
if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH)) {
mMapboxMap.getUiSettings().setZoomControlsEnabled(true);
}
+
+
}
private void setInitialState(MapboxMapOptions options) {
@@ -446,13 +449,8 @@ public class MapView extends FrameLayout {
iterator.remove();
}
}
- } else if (change == REGION_IS_CHANGING) {
- LatLngBounds bounds = mMapboxMap.getProjection().getVisibleRegion().latLngBounds;
- long[] ids = mNativeMapView.getAnnotationsInBounds(bounds);
- Log.v(MapboxConstants.TAG, "Region is changing ane we are seeing: "+ids.length+ " point annotations");
-// for (long id : ids) {
-// Log.v(MapboxConstants.TAG, "Marker: "+id);
-// }
+ } else if (change == REGION_IS_CHANGING || change == REGION_DID_CHANGE) {
+ new MarkerInBoundsTask().execute();
}
}
});
@@ -466,6 +464,60 @@ public class MapView extends FrameLayout {
}
}
+ private class MarkerInBoundsTask extends AsyncTask<Void, Void, Void>{
+ @Override
+ protected Void doInBackground(Void... params) {
+ LatLngBounds bounds = mMapboxMap.getProjection().getVisibleRegion().latLngBounds;
+ long[] ids = mNativeMapView.getAnnotationsInBounds(bounds);
+ LongSparseArray<View> markerViews = mMapboxMap.getMarkerViews();
+
+ MapboxMap.MarkerViewAdapter adapter = mMapboxMap.getMarkerViewAdapter();
+
+ boolean found;
+ long key;
+
+ // introduce new markers
+ for (long id : ids) {
+ found = false;
+ for (int i = 0; i < markerViews.size(); i++) {
+ key = markerViews.keyAt(i);
+
+ if (id == key) {
+ found = true;
+ }
+ }
+
+ if (!found) {
+ Log.v(MapboxConstants.TAG, "Adding " + id);
+// if(adapter!=null) {
+// mMapboxMap.addMarkerView(id, adapter.getView((Marker) mMapboxMap.getAnnotation(id), null, MapView.this));
+// }
+ markerViews.append(id, null);
+ } else {
+ Log.v(MapboxConstants.TAG, "Already added " + id);
+ }
+ }
+
+ // clean up out of bound markers
+ for (int i = 0; i < markerViews.size(); i++) {
+ found = false;
+ key = markerViews.keyAt(i);
+ for (long id : ids) {
+ if (id == key) {
+ found = true;
+ }
+ }
+ if (!found) {
+ Log.v(MapboxConstants.TAG, "Removing " + key);
+ markerViews.remove(key);
+ }
+ }
+
+ Log.v(MapboxConstants.TAG, "Amount of annotations: " + markerViews.size());
+ return null;
+ }
+ }
+
/**
* You must call this method from the parent's {@link android.app.Activity#onSaveInstanceState(Bundle)}
* or {@link android.app.Fragment#onSaveInstanceState(Bundle)}.
@@ -842,6 +894,11 @@ public class MapView extends FrameLayout {
//
/**
+ * <p>
+ * DEPRECATED @see MapboxAccountManager#start(String)
+ * </p>
+ * <p>
+ * <p>
* Sets the current Mapbox access token used to load map styles and tiles.
* <p>
* You must set a valid access token before you call {@link MapView#onCreate(Bundle)}
@@ -867,8 +924,13 @@ public class MapView extends FrameLayout {
}
/**
+ * <p>
+ * DEPRECATED @see MapboxAccountManager#getAccessToken()
+ * </p>
+ * <p>
* Returns the current Mapbox access token used to load map styles and tiles.
- *
+ * </p>
+ *
* @return The current Mapbox access token.
* @deprecated As of release 4.1.0, replaced by {@link MapboxAccountManager#getAccessToken()}
*/
@@ -1282,6 +1344,10 @@ public class MapView extends FrameLayout {
private class SurfaceTextureListener implements TextureView.SurfaceTextureListener {
private Surface mSurface;
+ private View mViewHolder;
+
+ private static final int VIEW_MARKERS_POOL_SIZE = 20;
+
// Called when the native surface texture has been created
// Must do all EGL/GL ES initialization here
@@ -1289,7 +1355,6 @@ public class MapView extends FrameLayout {
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mNativeMapView.createSurface(mSurface = new Surface(surface));
mNativeMapView.resizeFramebuffer(width, height);
-
mHasSurface = true;
}
@@ -1330,8 +1395,15 @@ public class MapView extends FrameLayout {
mCompassView.update(getDirection());
mMyLocationView.update();
- for (MarkerView view : mMapboxMap.getMarkerViews()) {
- view.update();
+ LongSparseArray<View> viewMarkers = mMapboxMap.getMarkerViews();
+ for (int i = 0; i < viewMarkers.size(); i++) {
+ mViewHolder = viewMarkers.valueAt(i);
+ if (mViewHolder != null) {
+ Marker marker = (Marker) mMapboxMap.getAnnotation(viewMarkers.keyAt(i));
+ PointF point = mMapboxMap.getProjection().toScreenLocation(marker.getPosition());
+ mViewHolder.setX(point.x - (mViewHolder.getMeasuredWidth() / 2));
+ mViewHolder.setY(point.y - (mViewHolder.getMeasuredHeight() / 2));
+ }
}
for (InfoWindow infoWindow : mMapboxMap.getInfoWindows()) {
@@ -2667,7 +2739,7 @@ public class MapView extends FrameLayout {
private String mStyle;
private boolean mDefaultStyle;
- StyleInitializer(@NonNull Context context) {
+ StyleInitializer(@NonNull Context context) {
mStyle = Style.getMapboxStreetsUrl(context.getResources().getInteger(R.integer.style_version));
mDefaultStyle = true;
}
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 b12371b3ab..822572298d 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
@@ -14,13 +14,15 @@ import android.util.Log;
import android.view.View;
import com.mapbox.mapboxsdk.MapboxAccountManager;
+
+import android.view.ViewGroup;
+
import com.mapbox.mapboxsdk.annotations.Annotation;
import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
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;
@@ -36,6 +38,7 @@ import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.layers.CustomLayer;
import com.mapbox.mapboxsdk.location.LocationListener;
import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings;
+
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -61,7 +64,7 @@ public class MapboxMap {
private LongSparseArray<Annotation> mAnnotations;
private List<Marker> mSelectedMarkers;
- private List<MarkerView> mMarkerViews;
+ private LongSparseArray<View> mMarkerViews;
private List<InfoWindow> mInfoWindows;
private MapboxMap.InfoWindowAdapter mInfoWindowAdapter;
@@ -93,8 +96,8 @@ public class MapboxMap {
mTrackingSettings = new TrackingSettings(mMapView, mUiSettings);
mProjection = new Projection(mapView);
mAnnotations = new LongSparseArray<>();
+ mMarkerViews = new LongSparseArray<>();
mSelectedMarkers = new ArrayList<>();
- mMarkerViews = new ArrayList<>();
mInfoWindows = new ArrayList<>();
}
@@ -590,8 +593,12 @@ public class MapboxMap {
//
/**
+ * <p>
+ * DEPRECATED @see MapboxAccountManager#start(String)
+ * </p>
+ * <p>
* Sets the current Mapbox access token used to load map styles and tiles.
- *
+ * </p>
* @param accessToken Your public Mapbox access token.
* @see MapView#setAccessToken(String)
* @deprecated As of release 4.1.0, replaced by {@link com.mapbox.mapboxsdk.MapboxAccountManager#start(Context, String)}
@@ -603,7 +610,12 @@ public class MapboxMap {
}
/**
+ * <p>
+ * DEPRECATED @see MapboxAccountManager#getAccessToken()
+ * </p>
+ * <p>
* Returns the current Mapbox access token used to load map styles and tiles.
+ * </p>
*
* @return The current Mapbox access token.
* @deprecated As of release 4.1.0, replaced by {@link MapboxAccountManager#getAccessToken()}
@@ -619,9 +631,8 @@ public class MapboxMap {
// Annotations
//
- public void addMarkerView(MarkerView markerView){
- markerView.setProjection(mProjection);
- mMarkerViews.add(markerView);
+ public void addMarkerView(long key, View markerView) {
+ mMarkerViews.append(key, markerView);
mMapView.addView(markerView);
}
@@ -655,14 +666,6 @@ 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);
@@ -682,11 +685,11 @@ public class MapboxMap {
*/
@UiThread
@NonNull
- public List<Marker> addMarkers(@NonNull List<MarkerOptions> markerOptionsList) {
+ public List<Marker> addMarkers(@NonNull List<BaseMarkerOptions> markerOptionsList) {
int count = markerOptionsList.size();
List<Marker> markers = new ArrayList<>(count);
if (count > 0) {
- MarkerOptions markerOptions;
+ BaseMarkerOptions markerOptions;
Marker marker;
for (int i = 0; i < count; i++) {
markerOptions = markerOptionsList.get(i);
@@ -1021,18 +1024,6 @@ public class MapboxMap {
return markers;
}
- @Nullable
- public MarkerView getMarkerView(long id) {
- MarkerView markerView = null;
- List<Marker> 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.
*
@@ -1165,10 +1156,14 @@ public class MapboxMap {
return marker;
}
- public void setMarkerViewAdapter(@Nullable MarkerViewAdapter markerViewAdapter){
+ public void setMarkerViewAdapter(@Nullable MarkerViewAdapter markerViewAdapter) {
mMarkerViewAdapter = markerViewAdapter;
}
+ public MarkerViewAdapter getMarkerViewAdapter() {
+ return mMarkerViewAdapter;
+ }
+
//
// InfoWindow
//
@@ -1225,7 +1220,7 @@ public class MapboxMap {
}
// used by MapView
- List<MarkerView> getMarkerViews(){
+ LongSparseArray<View> getMarkerViews() {
return mMarkerViews;
}
@@ -1240,12 +1235,13 @@ public class MapboxMap {
/**
* Sets the distance from the edges of the map view’s frame to the edges of the map
* view’s logical viewport.
- *
+ * <p>
* When the value of this property is equal to {0,0,0,0}, viewport
* properties such as `centerCoordinate` assume a viewport that matches the map
* view’s frame. Otherwise, those properties are inset, excluding part of the
* frame from the viewport. For instance, if the only the top edge is inset, the
* map center is effectively shifted downward.
+ * </p>
*
* @param left The left margin in pixels.
* @param top The top margin in pixels.
@@ -1756,10 +1752,10 @@ public class MapboxMap {
View getInfoWindow(@NonNull Marker marker);
}
- public interface MarkerViewAdapter {
+ public interface MarkerViewAdapter<U extends Marker> {
@Nullable
- MarkerView getView(@NonNull Marker marker);
+ View getView(@NonNull U marker, @Nullable View convertView, @NonNull ViewGroup parent);
}
/**
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java
index 16de81cb2d..f354a51155 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java
@@ -15,6 +15,7 @@ import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
+import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.maps.MapboxMap;
@@ -121,7 +122,7 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView
}
}
- private static class LoadBulkMarkerTask extends AsyncTask<Void, Integer, List<MarkerOptions>> {
+ private static class LoadBulkMarkerTask extends AsyncTask<Void, Integer, List<BaseMarkerOptions>> {
private static final String TAG = "LoadBulkMarkerTask";
private MapboxMap mMapboxMap;
@@ -138,8 +139,8 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView
}
@Override
- protected List<MarkerOptions> doInBackground(Void... params) {
- List<MarkerOptions> markerOptions = new ArrayList<>(mAmount);
+ protected List<BaseMarkerOptions> doInBackground(Void... params) {
+ List<BaseMarkerOptions> markerOptions = new ArrayList<>(mAmount);
try {
DecimalFormat formatter = new DecimalFormat("#.#####");
String json = GeoParseUtil.loadStringFromAssets(mAppContext, "points.geojson");
@@ -170,7 +171,7 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView
}
@Override
- protected void onPostExecute(List<MarkerOptions> markerOptions) {
+ protected void onPostExecute(List<BaseMarkerOptions> markerOptions) {
super.onPostExecute(markerOptions);
mMapboxMap.addMarkers(markerOptions);
mProgressDialog.hide();
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java
index 27615da5dd..1a980cd571 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java
@@ -1,29 +1,34 @@
package com.mapbox.mapboxsdk.testapp.activity.annotation;
+import android.content.Context;
import android.os.Bundle;
-import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
+import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
-import com.mapbox.mapboxsdk.annotations.Marker;
-import com.mapbox.mapboxsdk.annotations.MarkerOptions;
-import com.mapbox.mapboxsdk.annotations.MarkerView;
+import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
import com.mapbox.mapboxsdk.testapp.R;
-import com.mapbox.mapboxsdk.testapp.view.CustomMarkerView;
+import com.mapbox.mapboxsdk.testapp.model.annotations.CountryMarker;
+import com.mapbox.mapboxsdk.testapp.model.annotations.CountryMarkerOptions;
+
+import java.util.ArrayList;
+import java.util.List;
public class ViewMarkerActivity extends AppCompatActivity implements OnMapReadyCallback {
private MapView mMapView;
- private Marker brazil, germany, china, us;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -46,37 +51,46 @@ public class ViewMarkerActivity extends AppCompatActivity implements OnMapReadyC
@Override
public void onMapReady(MapboxMap mapboxMap) {
+ List<BaseMarkerOptions> countries = new ArrayList<>();
+ countries.add(new CountryMarkerOptions().abbrevName("ch").flagRes(R.drawable.ic_china).position(new LatLng(31.230416, 121.473701)));
+ countries.add(new CountryMarkerOptions().abbrevName("us").flagRes(R.drawable.ic_us).position(new LatLng(38.907192, -77.036871)));
+ countries.add(new CountryMarkerOptions().abbrevName("br").flagRes(R.drawable.ic_brazil).position(new LatLng(-15.798200, -47.922363)));
+ countries.add(new CountryMarkerOptions().abbrevName("de").flagRes(R.drawable.ic_germany).position(new LatLng(52.520007, 13.404954)));
+ mapboxMap.addMarkers(countries);
+
+ mapboxMap.setMarkerViewAdapter(new CountryAdapter(this));
+ }
- // adapt GL-marker to View-marker
- mapboxMap.setMarkerViewAdapter(new MapboxMap.MarkerViewAdapter() {
- @Nullable
- @Override
- public MarkerView getView(@NonNull Marker marker) {
- if (marker.equals(brazil)) {
- return createMarkerView("br", R.drawable.ic_brazil);
- } else if (marker.equals(germany)) {
- return createMarkerView("de", R.drawable.ic_germany);
- } else if (marker.equals(china)) {
- return createMarkerView("ch", R.drawable.ic_china);
- } else if (marker.equals(us)) {
- return createMarkerView("us", R.drawable.ic_us);
- }
- return null;
- }
- });
+ private static class CountryAdapter implements MapboxMap.MarkerViewAdapter<CountryMarker> {
- // add markers
- china = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(31.230416, 121.473701)));
- brazil = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(-15.798200, -47.922363)));
- us = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(38.907192, -77.036871)));
- germany = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(52.520007, 13.404954)));
- }
+ private LayoutInflater inflater;
+
+ public CountryAdapter(@NonNull Context context) {
+ this.inflater = LayoutInflater.from(context);
+ }
- private MarkerView createMarkerView(String countryAbbrev, @DrawableRes int countryIconRes) {
- CustomMarkerView customMarkerView = new CustomMarkerView(this);
- customMarkerView.setText(countryAbbrev);
- customMarkerView.setImage(countryIconRes);
- return customMarkerView;
+ @Nullable
+ @Override
+ public View getView(@NonNull CountryMarker marker, @Nullable View convertView, @NonNull ViewGroup parent) {
+ ViewHolder viewHolder;
+ if (convertView == null) {
+ viewHolder = new ViewHolder();
+ convertView = inflater.inflate(R.layout.view_custom_marker, parent, false);
+ viewHolder.flag = (ImageView) convertView.findViewById(R.id.imageView);
+ viewHolder.abbrev = (TextView) convertView.findViewById(R.id.textView);
+ convertView.setTag(viewHolder);
+ } else {
+ viewHolder = (ViewHolder) convertView.getTag();
+ }
+ viewHolder.flag.setImageResource(marker.getFlagRes());
+ viewHolder.abbrev.setText(marker.getAbbrevName());
+ return convertView;
+ }
+
+ private static class ViewHolder {
+ ImageView flag;
+ TextView abbrev;
+ }
}
@Override
@@ -119,5 +133,4 @@ public class ViewMarkerActivity extends AppCompatActivity implements OnMapReadyC
super.onLowMemory();
mMapView.onLowMemory();
}
-
} \ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarker.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarker.java
new file mode 100644
index 0000000000..7503b48df3
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarker.java
@@ -0,0 +1,24 @@
+package com.mapbox.mapboxsdk.testapp.model.annotations;
+
+import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
+import com.mapbox.mapboxsdk.annotations.Marker;
+
+public class CountryMarker extends Marker {
+
+ private String abbrevName;
+ private int flagRes;
+
+ public CountryMarker(BaseMarkerOptions baseMarkerOptions, String abbrevName, int iconRes) {
+ super(baseMarkerOptions);
+ this.abbrevName = abbrevName;
+ this.flagRes = iconRes;
+ }
+
+ public String getAbbrevName() {
+ return abbrevName;
+ }
+
+ public int getFlagRes() {
+ return flagRes;
+ }
+} \ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerOptions.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerOptions.java
new file mode 100644
index 0000000000..ac1ff25bf2
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerOptions.java
@@ -0,0 +1,75 @@
+package com.mapbox.mapboxsdk.testapp.model.annotations;
+
+import android.graphics.Bitmap;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
+import com.mapbox.mapboxsdk.annotations.Icon;
+import com.mapbox.mapboxsdk.annotations.IconFactory;
+import com.mapbox.mapboxsdk.geometry.LatLng;
+
+public class CountryMarkerOptions extends BaseMarkerOptions<CountryMarker, CountryMarkerOptions> {
+
+ private String abbrevName;
+ private int flagRes;
+
+ public CountryMarkerOptions abbrevName(String name) {
+ abbrevName = name;
+ return getThis();
+ }
+
+ public CountryMarkerOptions flagRes(int imageRes) {
+ flagRes = imageRes;
+ return getThis();
+ }
+
+ public CountryMarkerOptions() {
+ }
+
+ private CountryMarkerOptions(Parcel in) {
+ position((LatLng) in.readParcelable(LatLng.class.getClassLoader()));
+ snippet(in.readString());
+ String iconId = in.readString();
+ Bitmap iconBitmap = in.readParcelable(Bitmap.class.getClassLoader());
+ Icon icon = IconFactory.recreate(iconId, iconBitmap);
+ icon(icon);
+ title(in.readString());
+ }
+
+ @Override
+ public CountryMarkerOptions getThis() {
+ return this;
+ }
+
+ @Override
+ public CountryMarker getMarker() {
+ return new CountryMarker(this, abbrevName, flagRes);
+ }
+
+ public static final Parcelable.Creator<CountryMarkerOptions> CREATOR
+ = new Parcelable.Creator<CountryMarkerOptions>() {
+ public CountryMarkerOptions createFromParcel(Parcel in) {
+ return new CountryMarkerOptions(in);
+ }
+
+ public CountryMarkerOptions[] newArray(int size) {
+ return new CountryMarkerOptions[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeParcelable(position, flags);
+ out.writeString(snippet);
+ out.writeString(icon.getId());
+ out.writeParcelable(icon.getBitmap(), flags);
+ out.writeString(title);
+ }
+
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/view/CustomMarkerView.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/view/CustomMarkerView.java
deleted file mode 100644
index 761500aa43..0000000000
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/view/CustomMarkerView.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.mapbox.mapboxsdk.testapp.view;
-
-import android.content.Context;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.NonNull;
-import android.view.LayoutInflater;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.mapbox.mapboxsdk.annotations.MarkerView;
-import com.mapbox.mapboxsdk.testapp.R;
-
-public class CustomMarkerView extends MarkerView {
-
- private TextView textView;
- private ImageView imageView;
-
- public CustomMarkerView(Context context) {
- super(context);
- init(context);
- }
-
- private void init(Context context) {
- LayoutInflater.from(context).inflate(R.layout.view_custom_marker, this);
- textView = (TextView) findViewById(R.id.textView);
- imageView = (ImageView) findViewById(R.id.imageView);
- }
-
- public void setText(@NonNull String text) {
- textView.setText(text);
- }
-
- public void setImage(@DrawableRes int drawableRes) {
- imageView.setImageResource(drawableRes);
- }
-}