diff options
Diffstat (limited to 'platform/android')
6 files changed, 114 insertions, 21 deletions
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 6bdc71819d..74b850f7dd 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 @@ -456,14 +456,7 @@ public class MapView extends FrameLayout { } } else if (change == REGION_IS_CHANGING || change == REGION_DID_CHANGE) { if (mMapboxMap.getMarkerViewAdapter() != null) { - long currentTime = SystemClock.elapsedRealtime(); - - if (mViewMarkersUpdateRunning || currentTime < mViewMarkerBoundsUpdateTime) { - return; - } - - mViewMarkerBoundsUpdateTime = currentTime + 300; - new MarkerInBoundsTask().execute(); + invalidateViewMarkers(); } } } @@ -478,8 +471,18 @@ public class MapView extends FrameLayout { } } + void invalidateViewMarkers(){ + long currentTime = SystemClock.elapsedRealtime(); - public class MarkerInBoundsTask extends AsyncTask<Void, Void, MarkerInBoundsTask.Result> { + if (mViewMarkersUpdateRunning || currentTime < mViewMarkerBoundsUpdateTime) { + return; + } + + mViewMarkerBoundsUpdateTime = currentTime + 300; + new ViewMarkerInBoundsTask().execute(); + } + + public class ViewMarkerInBoundsTask extends AsyncTask<Void, Void, ViewMarkerInBoundsTask.Result> { @Override protected void onPreExecute() { @@ -1454,12 +1457,14 @@ public class MapView extends FrameLayout { 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)); + if(marker!=null) { + PointF point = mMapboxMap.getProjection().toScreenLocation(marker.getPosition()); + mViewHolder.setX(point.x - (mViewHolder.getMeasuredWidth() / 2)); + mViewHolder.setY(point.y - (mViewHolder.getMeasuredHeight() / 2)); - if (mViewHolder.getVisibility() == View.GONE) { - mViewHolder.setVisibility(View.VISIBLE); + if (mViewHolder.getVisibility() == View.GONE) { + mViewHolder.setVisibility(View.VISIBLE); + } } } } 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 ea15583d91..f4fb15b149 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 @@ -636,9 +636,11 @@ public class MapboxMap { // Annotations // - void setViewMarkersBoundsTaskResult(MapView.MarkerInBoundsTask.Result result) { + void setViewMarkersBoundsTaskResult(MapView.ViewMarkerInBoundsTask.Result result) { Map<Marker, View> outBoundsMarker = result.getOutBounds(); View convertView; + + // out of bounds markers for (Map.Entry<Marker, View> outBoundsEntry : outBoundsMarker.entrySet()) { convertView = outBoundsEntry.getValue(); if (convertView != null) { @@ -648,6 +650,7 @@ public class MapboxMap { } } + // in bounds markers List<Marker> inBoundsMarkers = result.getInBounds(); for (final Marker marker : inBoundsMarkers) { convertView = viewSimplePool.acquire(); @@ -953,13 +956,24 @@ public class MapboxMap { @UiThread public void removeAnnotation(@NonNull Annotation annotation) { if (annotation instanceof Marker) { - ((Marker) annotation).hideInfoWindow(); + Marker marker = (Marker) annotation; + marker.hideInfoWindow(); + removeMarkerView(annotation.getId()); } long id = annotation.getId(); mMapView.removeAnnotation(id); mAnnotations.remove(id); } + private void removeMarkerView(long id){ + View viewHolder = mMarkerViews.get(id); + if(viewHolder!=null) { + viewHolder.setVisibility(View.GONE); + viewSimplePool.release(viewHolder); + } + mMarkerViews.remove(id); + } + /** * Removes an annotation from the map * @@ -984,6 +998,7 @@ public class MapboxMap { Annotation annotation = annotationList.get(i); if (annotation instanceof Marker) { ((Marker) annotation).hideInfoWindow(); + removeMarkerView(annotation.getId()); } ids[i] = annotationList.get(i).getId(); } @@ -1198,6 +1213,9 @@ public class MapboxMap { public void setMarkerViewAdapter(@Nullable MarkerViewAdapter markerViewAdapter) { mMarkerViewAdapter = markerViewAdapter; + if(markerViewAdapter!=null){ + mMapView.invalidateViewMarkers(); + } } public MarkerViewAdapter getMarkerViewAdapter() { 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 f354a51155..a0171e4c6a 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 @@ -5,22 +5,29 @@ import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; 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.util.Log; +import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.ImageView; import android.widget.Spinner; +import android.widget.TextView; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.MarkerOptions; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.mapboxsdk.testapp.R; +import com.mapbox.mapboxsdk.testapp.model.annotations.CountryMarker; import com.mapbox.mapboxsdk.testapp.utils.GeoParseUtil; import com.mapbox.mapboxsdk.maps.MapView; @@ -58,6 +65,8 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView public void onMapReady(@NonNull MapboxMap mapboxMap) { mMapboxMap = mapboxMap; + mMapboxMap.setMarkerViewAdapter(new TextAdapter(BulkMarkerActivity.this)); + if (actionBar != null) { ArrayAdapter<CharSequence> spinnerAdapter = ArrayAdapter.createFromResource(actionBar.getThemedContext(), R.array.bulk_marker_list, android.R.layout.simple_spinner_item); spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -67,9 +76,38 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView } } }); + } + + private static class TextAdapter implements MapboxMap.MarkerViewAdapter<Marker> { + + private LayoutInflater inflater; + + public TextAdapter(@NonNull Context context) { + this.inflater = LayoutInflater.from(context); + } + @Nullable + @Override + public View getView(@NonNull Marker marker, @Nullable View convertView, @NonNull ViewGroup parent) { + ViewHolder viewHolder; + if (convertView == null) { + viewHolder = new ViewHolder(); + convertView = inflater.inflate(R.layout.view_text_marker, parent, false); + viewHolder.title = (TextView) convertView.findViewById(R.id.textView); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + viewHolder.title.setText(marker.getTitle()); + return convertView; + } + + private static class ViewHolder { + TextView title; + } } + @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { int markersAmount = Integer.valueOf(getResources().getStringArray(R.array.bulk_marker_list)[position]); @@ -155,7 +193,7 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView location = locations.get(i); markerOptions.add(new MarkerOptions() .position(location) - .title("Marker") + .title(String.valueOf(i)) .snippet(formatter.format(location.getLatitude()) + ", " + formatter.format(location.getLongitude()))); } 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 de4aa81a60..735ab8088f 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 @@ -57,12 +57,12 @@ public class ViewMarkerActivity extends AppCompatActivity implements OnMapReadyC public void onMapReady(final MapboxMap mapboxMap) { // Add country markers - List<BaseMarkerOptions> countries = new ArrayList<>(); + final List<BaseMarkerOptions> countries = new ArrayList<>(); countries.add(new CountryMarkerOptions().title("China").abbrevName("ch").flagRes(R.drawable.ic_china).position(new LatLng(31.230416, 121.473701))); countries.add(new CountryMarkerOptions().title("United States").abbrevName("us").flagRes(R.drawable.ic_us).position(new LatLng(38.907192, -77.036871))); countries.add(new CountryMarkerOptions().title("Brazil").abbrevName("br").flagRes(R.drawable.ic_brazil).position(new LatLng(-15.798200, -47.922363))); countries.add(new CountryMarkerOptions().title("Germany").abbrevName("de").flagRes(R.drawable.ic_germany).position(new LatLng(52.520007, 13.404954))); - mapboxMap.addMarkers(countries); + final List<Marker> markers = mapboxMap.addMarkers(countries); // Add view marker adapter mapboxMap.setMarkerViewAdapter(new CountryAdapter(this)); @@ -72,6 +72,13 @@ public class ViewMarkerActivity extends AppCompatActivity implements OnMapReadyC Log.d(MapboxConstants.TAG, "Country clicked " + ((CountryMarker) marker).getAbbrevName()); } }); + + findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mapboxMap.removeAnnotation(markers.get(2)); + } + }); } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_marker_view.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_marker_view.xml index 12dee036fb..b15b5becd2 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_marker_view.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_marker_view.xml @@ -27,10 +27,19 @@ <com.mapbox.mapboxsdk.maps.MapView android:id="@id/mapView" android:layout_width="match_parent" - android:layout_height="match_parent" app:access_token="@string/mapbox_access_token" app:style_url="@string/style_light" - app:zoom="1" /> + app:zoom="1" + android:layout_height="match_parent" /> + + <android.support.design.widget.FloatingActionButton + android:id="@id/fab" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|bottom" + android:layout_margin="@dimen/fab_margin" + android:src="@drawable/ic_layers_24dp" + app:backgroundTint="@color/primary" /> </android.support.design.widget.CoordinatorLayout> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_text_marker.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_text_marker.xml new file mode 100644 index 0000000000..8a3508691a --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_text_marker.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@color/mapbox_green"> + + <TextView + android:id="@id/textView" + android:layout_width="wrap_content" + android:textColor="@android:color/white" + android:layout_height="wrap_content" + android:textStyle="bold" + android:padding="4dp" + android:layout_centerInParent="true" /> + +</RelativeLayout>
\ No newline at end of file |