From e69aef83430c42e3f5be0f01aea1433627b8cc7c Mon Sep 17 00:00:00 2001 From: Tobrun Date: Thu, 19 May 2016 14:40:23 +0200 Subject: [android] #3276 - add tilt support for view markers --- .../mapboxsdk/annotations/MarkerViewSettings.java | 93 ++------ .../java/com/mapbox/mapboxsdk/maps/MapView.java | 27 +-- .../java/com/mapbox/mapboxsdk/maps/MapboxMap.java | 142 ++++++------ .../src/main/AndroidManifest.xml | 11 +- .../activity/annotation/BulkMarkerActivity.java | 75 ++++--- .../MultipleViewMarkerAdapterActivity.java | 249 --------------------- .../activity/annotation/ViewMarkerActivity.java | 160 ------------- .../annotation/ViewMarkerAdapterActivity.java | 245 ++++++++++++++++++++ .../src/main/res/animator/rotate_360.xml | 8 + .../src/main/res/layout/activity_marker_bulk.xml | 3 +- .../src/main/res/layout/activity_marker_view.xml | 58 ++--- .../src/main/res/values/strings.xml | 2 - 12 files changed, 414 insertions(+), 659 deletions(-) delete mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MultipleViewMarkerAdapterActivity.java delete 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/activity/annotation/ViewMarkerAdapterActivity.java create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/rotate_360.xml (limited to 'platform') diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewSettings.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewSettings.java index 2712578dad..cc2b0d0ccb 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewSettings.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewSettings.java @@ -2,40 +2,26 @@ package com.mapbox.mapboxsdk.annotations; import android.graphics.Point; import android.graphics.PointF; -import android.os.Parcel; -import android.os.Parcelable; import android.support.annotation.AnimatorRes; import android.support.annotation.NonNull; -public class MarkerViewSettings implements Parcelable { +public class MarkerViewSettings { private PointF centerOffset; private Point infoWindowOffset; private boolean flat; - private int animEnterRes; - private int animSelectRes; - private int animDeselectRes; - private int animExitRes; + private int selectAnimRes; + private int deselectAnimRes; - MarkerViewSettings(PointF centerOffset, Point infoWindowOffset, boolean flat, int animEnterRes, int animSelectRes, int animDeselectRes, int animExitRes) { + private float tiltValue; + + MarkerViewSettings(PointF centerOffset, Point infoWindowOffset, boolean flat, int selectAnimRes, int deselectAnimRes) { this.centerOffset = centerOffset; this.infoWindowOffset = infoWindowOffset; this.flat = flat; - this.animEnterRes = animEnterRes; - this.animSelectRes = animSelectRes; - this.animDeselectRes = animDeselectRes; - this.animExitRes = animExitRes; - } - - MarkerViewSettings(Parcel parcel) { - this.centerOffset = parcel.readParcelable(PointF.class.getClassLoader()); - this.infoWindowOffset = parcel.readParcelable(Point.class.getClassLoader()); - this.flat = parcel.readByte() != 0; - this.animEnterRes = parcel.readInt(); - this.animSelectRes = parcel.readInt(); - this.animDeselectRes = parcel.readInt(); - this.animExitRes = parcel.readInt(); + this.selectAnimRes = selectAnimRes; + this.deselectAnimRes = deselectAnimRes; } @NonNull @@ -48,55 +34,26 @@ public class MarkerViewSettings implements Parcelable { return infoWindowOffset; } - public boolean isFlat() { - return flat; - } - - @AnimatorRes - public int getAnimEnterRes() { - return animEnterRes; - } - @AnimatorRes - public int getAnimSelectRes() { - return animSelectRes; + public int getSelectAnimRes() { + return selectAnimRes; } @AnimatorRes - public int getAnimDeselectRes() { - return animDeselectRes; + public int getDeselectAnimRes() { + return deselectAnimRes; } - @AnimatorRes - public int getAnimExitRes() { - return animExitRes; + public boolean isFlat() { + return flat; } - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - public MarkerViewSettings createFromParcel(Parcel in) { - return new MarkerViewSettings(in); - } - - public MarkerViewSettings[] newArray(int size) { - return new MarkerViewSettings[size]; - } - }; - - @Override - public int describeContents() { - return 0; + public void setTiltValue(float tilt) { + tiltValue = tilt; } - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeParcelable(centerOffset, flags); - dest.writeParcelable(infoWindowOffset, flags); - dest.writeByte((byte) (flat ? 1 : 0)); - dest.writeInt(animEnterRes); - dest.writeInt(animSelectRes); - dest.writeInt(animDeselectRes); - dest.writeInt(animExitRes); + public float getTiltValue() { + return tiltValue; } /** @@ -108,10 +65,8 @@ public class MarkerViewSettings implements Parcelable { private Point infoWindowOffset; private boolean flat; - private int animEnterRes; private int animSelectRes; private int animDeselectRes; - private int animExitRes; public Builder() { centerOffset = new PointF(); @@ -133,11 +88,6 @@ public class MarkerViewSettings implements Parcelable { return this; } - public Builder animEnterRes(@AnimatorRes int animatorRes) { - animEnterRes = animatorRes; - return this; - } - public Builder animSelectRes(@AnimatorRes int animatorRes) { animSelectRes = animatorRes; return this; @@ -148,13 +98,8 @@ public class MarkerViewSettings implements Parcelable { return this; } - public Builder animExitRes(@AnimatorRes int animatorRes) { - animExitRes = animatorRes; - return this; - } - public MarkerViewSettings build() { - return new MarkerViewSettings(centerOffset, infoWindowOffset, flat, animEnterRes, animSelectRes, animDeselectRes, animExitRes); + return new MarkerViewSettings(centerOffset, infoWindowOffset, flat, animSelectRes, animDeselectRes); } } } 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 3853cd362f..593f68814a 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 @@ -158,7 +158,6 @@ public class MapView extends FrameLayout { private List mOnMapReadyCallbackList; private long mViewMarkerBoundsUpdateTime; - private boolean mViewMarkersUpdateRunning; @UiThread public MapView(@NonNull Context context) { @@ -453,9 +452,11 @@ public class MapView extends FrameLayout { } } } else if (change == REGION_IS_CHANGING || change == REGION_DID_CHANGE) { - if (mMapboxMap.getMarkerViewAdapters() != null) { + if (!mMapboxMap.getMarkerViewAdapters().isEmpty()) { invalidateViewMarkers(); } + }else if(change== DID_FINISH_LOADING_MAP){ + invalidateViewMarkers(); } } }); @@ -471,17 +472,11 @@ public class MapView extends FrameLayout { void invalidateViewMarkers() { long currentTime = SystemClock.elapsedRealtime(); - - if (mViewMarkersUpdateRunning || currentTime < mViewMarkerBoundsUpdateTime) { + if (currentTime < mViewMarkerBoundsUpdateTime) { return; } - mViewMarkerBoundsUpdateTime = currentTime + 300; - mViewMarkersUpdateRunning = true; - mMapboxMap.invalidateViewMarkersInBounds(); - - mViewMarkersUpdateRunning = false; - Log.v(MapboxConstants.TAG, "Amount of child views " + getChildCount()); + mViewMarkerBoundsUpdateTime = currentTime + 250; } /** @@ -623,13 +618,9 @@ public class MapView extends FrameLayout { return mNativeMapView.getPitch(); } - void setTilt(Double pitch, @Nullable Long duration) { - long actualDuration = 0; - if (duration != null) { - actualDuration = duration; - } + void setTilt(Double pitch) { mMyLocationView.setTilt(pitch); - mNativeMapView.setPitch(pitch, actualDuration); + mNativeMapView.setPitch(pitch, 0); } @@ -1356,8 +1347,6 @@ public class MapView extends FrameLayout { return; } - Log.v(MapboxConstants.TAG, "SurfaceTexture has been updated"); - mCompassView.update(getDirection()); mMyLocationView.update(); @@ -2003,7 +1992,7 @@ public class MapView extends FrameLayout { pitch = Math.max(MapboxConstants.MINIMUM_TILT, Math.min(MapboxConstants.MAXIMUM_TILT, pitch)); // Tilt the map - setTilt(pitch, null); + mMapboxMap.setTilt(pitch); return 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 14e5d706e8..ca3fdc21a0 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 @@ -7,10 +7,8 @@ import android.animation.AnimatorListenerAdapter; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Point; -import android.graphics.PointF; import android.location.Location; import android.os.SystemClock; -import android.support.annotation.AnimatorRes; import android.support.annotation.FloatRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -655,8 +653,6 @@ public class MapboxMap { void invalidateViewMarkersInBounds() { List markers = mMapView.getMarkersInBounds(mProjection.getVisibleRegion().latLngBounds); - Log.v(MapboxConstants.TAG, "Annotations in bounds: " + markers.size()); - View convertView; // remove old markers @@ -667,7 +663,7 @@ public class MapboxMap { // remove marker convertView = mMarkerViewMap.get(m); MarkerViewSettings settings = mMarkerViewSettingsMap.get(m.getId()); - int deselectAnimRes = settings.getAnimDeselectRes(); + int deselectAnimRes = settings.getDeselectAnimRes(); if (deselectAnimRes != 0) { Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), deselectAnimRes); animator.setDuration(0); @@ -681,83 +677,92 @@ public class MapboxMap { // introduce new markers for (final Marker marker : markers) { - if (marker.isViewMarker()) { - if (!mMarkerViewMap.containsKey(marker)) { - Log.v("TAG", "Calling get view for " + marker.getId()); - for (final MarkerViewAdapter adapter : mMarkerViewAdapters) { - if (adapter.getMarkerClass() == marker.getClass()) { - - if (mMarkerViewSettingsMap.get(marker.getId()) == null) { - mMarkerViewSettingsMap.put(marker.getId(), adapter.getMarkerViewSettings(marker)); - } + if (marker.isViewMarker() && !mMarkerViewMap.containsKey(marker)) { + for (final MarkerViewAdapter adapter : mMarkerViewAdapters) { + if (adapter.getMarkerClass() == marker.getClass()) { + + MarkerViewSettings settings = mMarkerViewSettingsMap.get(marker.getId()); + if (settings == null) { + settings = adapter.getMarkerViewSettings(marker); + mMarkerViewSettingsMap.put(marker.getId(), settings); + } - convertView = (View) adapter.getViewReusePool().acquire(); - View adaptedView = adapter.getView(marker, convertView, mMapView); - - // set user provided offset to view marker - final MarkerViewSettings markerViewSettings = mMarkerViewSettingsMap.get(marker.getId()); - Point infoWindowOffset = markerViewSettings.getInfoWindowOffset(); - marker.setTopOffsetPixels(infoWindowOffset.y); - marker.setRightOffsetPixels(infoWindowOffset.x); - - if (adaptedView != null) { - if (mSelectedMarkers.contains(marker)) { - // if a marker to be shown was selected - // replay that animation with duration 0 - int selectAnimRes = markerViewSettings.getAnimSelectRes(); - if (selectAnimRes != 0) { - Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), selectAnimRes); - animator.setDuration(0); - animator.setTarget(convertView); - animator.start(); - } + convertView = (View) adapter.getViewReusePool().acquire(); + View adaptedView = adapter.getView(marker, convertView, mMapView); + + // infowindow offset + Point infoWindowOffset = settings.getInfoWindowOffset(); + marker.setTopOffsetPixels(infoWindowOffset.y); + marker.setRightOffsetPixels(infoWindowOffset.x); + + if (adaptedView != null) { + + // tilt + adaptedView.setRotationX(settings.getTiltValue()); + + if (mSelectedMarkers.contains(marker)) { + // if a marker to be shown was selected + // replay that animation with duration 0 + int selectAnimRes = settings.getSelectAnimRes(); + if (selectAnimRes != 0) { + Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), selectAnimRes); + animator.setDuration(0); + animator.setTarget(convertView); + animator.start(); } + } - adaptedView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - boolean clickHandled = false; - if (mOnMarkerViewClickListener != null) { - clickHandled = mOnMarkerViewClickListener.onMarkerClick(marker, v, adapter); - } + final int animSelectRes = settings.getSelectAnimRes(); + adaptedView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean clickHandled = false; + if (mOnMarkerViewClickListener != null) { + clickHandled = mOnMarkerViewClickListener.onMarkerClick(marker, v, adapter); + } - if (!clickHandled) { - int enterAnimatorRes = markerViewSettings.getAnimSelectRes(); - if (enterAnimatorRes != 0) { - Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), enterAnimatorRes); - animator.setTarget(v); - animator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - selectMarker(marker); - } - }); - animator.start(); - } else { - selectMarker(marker); - } + if (!clickHandled) { + if (animSelectRes != 0) { + Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), animSelectRes); + animator.setTarget(v); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + selectMarker(marker); + } + }); + animator.start(); + } else { + selectMarker(marker); } } - }); - - mMarkerViewMap.put(marker, adaptedView); - if (convertView == null) { - mMapView.addView(adaptedView); } + }); + + mMarkerViewMap.put(marker, adaptedView); + if (convertView == null) { + mMapView.addView(adaptedView); } } } - } else { - //already added - Log.v(MapboxConstants.TAG, "Marker already added"); } - } else { - Log.v(MapboxConstants.TAG, "Marker is not a view marker"); } } } + void setTilt(double tilt) { + for (Map.Entry entry : mMarkerViewMap.entrySet()) { + MarkerViewSettings settings = mMarkerViewSettingsMap.get(entry.getKey().getId()); + if (settings.isFlat()) { + settings.setTiltValue((float) tilt); + entry.getValue().setRotationX((float) tilt); + } + } + mMapView.setTilt(tilt); + } + + /** *

* Adds a marker to this map. @@ -1281,7 +1286,7 @@ public class MapboxMap { View viewMarker = mMarkerViewMap.get(marker); if (viewMarker != null) { - int deselectAnimatorRes = mMarkerViewSettingsMap.get(marker.getId()).getAnimDeselectRes(); + int deselectAnimatorRes = mMarkerViewSettingsMap.get(marker.getId()).getDeselectAnimRes(); if (deselectAnimatorRes != 0) { Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), deselectAnimatorRes); animator.setTarget(viewMarker); @@ -1965,7 +1970,6 @@ public class MapboxMap { public MarkerViewSettings getMarkerViewSettings(Marker marker) { return new MarkerViewSettings.Builder().build(); } - } public interface OnMarkerViewClickListener { diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index 214d80de69..699f4be891 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -254,7 +254,7 @@ - - - - parent, View view, int position, long id) { loadBulkMarkers(position); @@ -204,6 +168,43 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView } } + private class FabClickListener implements View.OnClickListener{ + @Override + public void onClick(View v) { + if (mMapboxMap != null) { + mCustomMarkerView = true; + + v.animate().alpha(0).start(); + mMapboxMap.addMarkerViewAdapter(new TextAdapter(BulkMarkerActivity.this)); + mMapView.addOnMapChangedListener(new MapView.OnMapChangedListener() { + @Override + public void onMapChanged(@MapView.MapChange int change) { + if (change == MapView.REGION_IS_CHANGING || change == MapView.REGION_DID_CHANGE) { + if (!mMapboxMap.getMarkerViewAdapters().isEmpty()) { + TextView viewCountView = (TextView) findViewById(R.id.countView); + viewCountView.setText("ViewCache size " + (mMapView.getChildCount() - 5)); + } + } + } + }); + + mMapboxMap.setOnMarkerViewClickListener(new MapboxMap.OnMarkerViewClickListener() { + @Override + public boolean onMarkerClick(@NonNull Marker marker, @NonNull View view, @NonNull MapboxMap.MarkerViewAdapter adapter) { + Toast.makeText(BulkMarkerActivity.this, "Hello " + marker.getId(), Toast.LENGTH_SHORT).show(); + return false; + } + }); + + // reload markers + Spinner spinner = (Spinner) findViewById(R.id.spinner); + if (spinner != null) { + loadBulkMarkers(spinner.getSelectedItemPosition()); + } + } + } + } + private static class LoadBulkMarkerTask extends AsyncTask> { private static final String TAG = "LoadBulkMarkerTask"; diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MultipleViewMarkerAdapterActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MultipleViewMarkerAdapterActivity.java deleted file mode 100644 index dfcbddb446..0000000000 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MultipleViewMarkerAdapterActivity.java +++ /dev/null @@ -1,249 +0,0 @@ -package com.mapbox.mapboxsdk.testapp.activity.annotation; - -import android.content.Context; -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.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import com.mapbox.mapboxsdk.annotations.Marker; -import com.mapbox.mapboxsdk.annotations.MarkerOptions; -import com.mapbox.mapboxsdk.annotations.MarkerViewSettings; -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.model.annotations.CountryMarker; -import com.mapbox.mapboxsdk.testapp.model.annotations.CountryMarkerOptions; - -public class MultipleViewMarkerAdapterActivity extends AppCompatActivity { - - private MapboxMap mMapboxMap; - private MapView mMapView; - - private final static LatLng[] LAT_LNGS = new LatLng[]{ - new LatLng(38.907327, -77.041293), - new LatLng(38.909698, -77.029642), - new LatLng(38.907227, -77.036530), - new LatLng(38.905607, -77.031916), - new LatLng(38.897424, -77.036508), - new LatLng(38.897642, -77.041980), - new LatLng(38.889876, -77.008849), - new LatLng(38.889441, -77.050134) - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_marker_bulk); - - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - final ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayShowTitleEnabled(false); - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setDisplayShowHomeEnabled(true); - } - - final TextView viewCountView = (TextView) findViewById(R.id.countView); - mMapView = (MapView) findViewById(R.id.mapView); - mMapView.onCreate(savedInstanceState); - mMapView.getMapAsync(new OnMapReadyCallback() { - @Override - public void onMapReady(@NonNull MapboxMap mapboxMap) { - mMapboxMap = mapboxMap; - - int infoWindowOffset = (int) getResources().getDimension(R.dimen.coordinatebounds_margin); - - // add flag marker - mMapboxMap.addMarker(new CountryMarkerOptions() - .markerView(true) - .title("United States") - .abbrevName("us") - .flagRes(R.drawable.ic_us) - .position(new LatLng(38.899774, -77.023237)) - ); - - mMapboxMap.addMarker(new CountryMarkerOptions() - .title("United States") - .abbrevName("us") - .flagRes(R.drawable.ic_us) - .position(new LatLng(38.902580, -77.050102)) - ); - - // add text markers - for (int i = 0; i < LAT_LNGS.length; i++) { - mMapboxMap.addMarker(new MarkerOptions() - .position(LAT_LNGS[i]) - .markerView(true) - .title(String.valueOf(i))); - } - - // set adapters - mMapboxMap.addMarkerViewAdapter(new TextAdapter(MultipleViewMarkerAdapterActivity.this)); - mMapboxMap.addMarkerViewAdapter(new CountryAdapter(MultipleViewMarkerAdapterActivity.this)); - - mMapView.addOnMapChangedListener(new MapView.OnMapChangedListener() { - @Override - public void onMapChanged(@MapView.MapChange int change) { - if (change == MapView.REGION_IS_CHANGING || change == MapView.REGION_DID_CHANGE) { - if (!mMapboxMap.getMarkerViewAdapters().isEmpty() && viewCountView != null) { - viewCountView.setText("ViewCache size " + (mMapView.getChildCount() - 5)); - } - } - } - }); - - mMapboxMap.setOnMarkerViewClickListener(new MapboxMap.OnMarkerViewClickListener() { - @Override - public boolean onMarkerClick(@NonNull Marker marker, @NonNull View view, @NonNull MapboxMap.MarkerViewAdapter adapter) { - Toast.makeText(MultipleViewMarkerAdapterActivity.this, "Hello " + marker.getId(), Toast.LENGTH_SHORT).show(); - return false; - } - }); - } - }); - } - - private static class TextAdapter extends MapboxMap.MarkerViewAdapter { - - private LayoutInflater inflater; - - public TextAdapter(@NonNull Context context) { - super(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; - } - - @Override - public MarkerViewSettings getMarkerViewSettings(Marker marker) { - MarkerViewSettings.Builder builder = new MarkerViewSettings.Builder() - .animSelectRes(R.animator.scale_up) - .animDeselectRes(R.animator.scale_down) - .infoWindowOffset(0, (int) getContext().getResources() - .getDimension(R.dimen.fab_margin)); - - if (marker.getId() == 0) { - builder.flat(true); - } - - return builder.build(); - } - - private static class ViewHolder { - TextView title; - } - } - - private static class CountryAdapter extends MapboxMap.MarkerViewAdapter { - - private LayoutInflater inflater; - - public CountryAdapter(@NonNull Context context) { - super(context); - this.inflater = LayoutInflater.from(context); - } - - @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; - } - - @Override - public MarkerViewSettings getMarkerViewSettings(Marker marker) { - return new MarkerViewSettings.Builder() - .animSelectRes(R.animator.scale_up) - .animDeselectRes(R.animator.scale_down) - .infoWindowOffset(0, (int) getContext().getResources() - .getDimension(R.dimen.coordinatebounds_margin)) - .flat(true) - .build(); - } - - private static class ViewHolder { - ImageView flag; - TextView abbrev; - } - } - - @Override - public void onResume() { - super.onResume(); - mMapView.onResume(); - } - - @Override - public void onPause() { - super.onPause(); - mMapView.onPause(); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - mMapView.onSaveInstanceState(outState); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - mMapView.onDestroy(); - } - - @Override - public void onLowMemory() { - super.onLowMemory(); - mMapView.onLowMemory(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - default: - return super.onOptionsItemSelected(item); - } - } -} 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 deleted file mode 100644 index b369adfcb7..0000000000 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.mapbox.mapboxsdk.testapp.activity.annotation; - -import android.content.Context; -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.ImageView; -import android.widget.TextView; - -import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; -import com.mapbox.mapboxsdk.annotations.Marker; -import com.mapbox.mapboxsdk.annotations.MarkerViewSettings; -import com.mapbox.mapboxsdk.constants.MapboxConstants; -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.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; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_marker_view); - - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setDisplayShowHomeEnabled(true); - } - - mMapView = (MapView) findViewById(R.id.mapView); - mMapView.onCreate(savedInstanceState); - mMapView.getMapAsync(this); - } - - @Override - public void onMapReady(final MapboxMap mapboxMap) { - final List countries = new ArrayList<>(); - countries.add(new CountryMarkerOptions().markerView(true).title("China").abbrevName("ch").flagRes(R.drawable.ic_china).position(new LatLng(31.230416, 121.473701))); - countries.add(new CountryMarkerOptions().markerView(true).title("United States").abbrevName("us").flagRes(R.drawable.ic_us).position(new LatLng(38.907192, -77.036871))); - countries.add(new CountryMarkerOptions().markerView(true).title("Brazil").abbrevName("br").flagRes(R.drawable.ic_brazil).position(new LatLng(-15.798200, -47.922363))); - countries.add(new CountryMarkerOptions().markerView(true).title("Germany").abbrevName("de").flagRes(R.drawable.ic_germany).position(new LatLng(52.520007, 13.404954))); - final List markers = mapboxMap.addMarkers(countries); - - // Add view marker adapter - mapboxMap.addMarkerViewAdapter(new CountryAdapter(this)); - mapboxMap.setOnMarkerViewClickListener(new MapboxMap.OnMarkerViewClickListener() { - @Override - public boolean onMarkerClick(@NonNull Marker marker, @NonNull View view, @NonNull MapboxMap.MarkerViewAdapter adapter) { - Log.d(MapboxConstants.TAG, "Country clicked " + ((CountryMarker) marker).getAbbrevName()); - return true; - } - }); - - View view = findViewById(R.id.fab); - if (view != null) { - view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mapboxMap.removeAnnotation(markers.get(2)); - } - }); - } - } - - - private static class CountryAdapter extends MapboxMap.MarkerViewAdapter { - - private LayoutInflater inflater; - - public CountryAdapter(@NonNull Context context) { - super(context); - this.inflater = LayoutInflater.from(context); - } - - @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 - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - @Override - public void onResume() { - super.onResume(); - mMapView.onResume(); - } - - @Override - public void onPause() { - super.onPause(); - mMapView.onPause(); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - mMapView.onSaveInstanceState(outState); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - mMapView.onDestroy(); - } - - @Override - public void onLowMemory() { - super.onLowMemory(); - mMapView.onLowMemory(); - } -} \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerAdapterActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerAdapterActivity.java new file mode 100644 index 0000000000..ef04b7abf3 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerAdapterActivity.java @@ -0,0 +1,245 @@ +package com.mapbox.mapboxsdk.testapp.activity.annotation; + +import android.content.Context; +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.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.mapbox.mapboxsdk.annotations.Marker; +import com.mapbox.mapboxsdk.annotations.MarkerOptions; +import com.mapbox.mapboxsdk.annotations.MarkerViewSettings; +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.model.annotations.CountryMarker; +import com.mapbox.mapboxsdk.testapp.model.annotations.CountryMarkerOptions; + +public class ViewMarkerAdapterActivity extends AppCompatActivity { + + private MapboxMap mMapboxMap; + private MapView mMapView; + + private final static LatLng[] LAT_LNGS = new LatLng[]{ + new LatLng(38.907327, -77.041293), + new LatLng(38.909698, -77.029642), + new LatLng(38.907227, -77.036530), + new LatLng(38.905607, -77.031916), + new LatLng(38.897424, -77.036508), + new LatLng(38.897642, -77.041980), + new LatLng(38.889876, -77.008849), + new LatLng(38.889441, -77.050134) + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_marker_view); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + final ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowHomeEnabled(true); + } + + final TextView viewCountView = (TextView) findViewById(R.id.countView); + mMapView = (MapView) findViewById(R.id.mapView); + mMapView.onCreate(savedInstanceState); + mMapView.getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(@NonNull MapboxMap mapboxMap) { + mMapboxMap = mapboxMap; + + // add text markers + for (int i = 0; i < LAT_LNGS.length; i++) { + mMapboxMap.addMarker(new MarkerOptions() + .position(LAT_LNGS[i]) + .markerView(true) + .title(String.valueOf(i))); + } + + // add flag marker + mMapboxMap.addMarker(new CountryMarkerOptions() + .markerView(true) + .title("United States") + .abbrevName("us") + .flagRes(R.drawable.ic_us) + .position(new LatLng(38.899774, -77.023237)) + ); + + // default GL marker + mMapboxMap.addMarker(new CountryMarkerOptions() + .title("United States") + .position(new LatLng(38.902580, -77.050102)) + ); + + // set adapters + mMapboxMap.addMarkerViewAdapter(new TextAdapter(ViewMarkerAdapterActivity.this)); + mMapboxMap.addMarkerViewAdapter(new CountryAdapter(ViewMarkerAdapterActivity.this)); + + mMapView.addOnMapChangedListener(new MapView.OnMapChangedListener() { + @Override + public void onMapChanged(@MapView.MapChange int change) { + if (change == MapView.REGION_IS_CHANGING || change == MapView.REGION_DID_CHANGE) { + if (!mMapboxMap.getMarkerViewAdapters().isEmpty() && viewCountView != null) { + viewCountView.setText("ViewCache size " + (mMapView.getChildCount() - 5)); + } + } + } + }); + + mMapboxMap.setOnMarkerViewClickListener(new MapboxMap.OnMarkerViewClickListener() { + @Override + public boolean onMarkerClick(@NonNull Marker marker, @NonNull View view, @NonNull MapboxMap.MarkerViewAdapter adapter) { + Toast.makeText(ViewMarkerAdapterActivity.this, "Hello " + marker.getId(), Toast.LENGTH_SHORT).show(); + return false; + } + }); + } + }); + } + + private static class TextAdapter extends MapboxMap.MarkerViewAdapter { + + private LayoutInflater inflater; + + public TextAdapter(@NonNull Context context) { + super(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; + } + + @Override + public MarkerViewSettings getMarkerViewSettings(Marker marker) { + MarkerViewSettings.Builder builder = new MarkerViewSettings.Builder() + .animSelectRes(R.animator.scale_up) + .animDeselectRes(R.animator.scale_down) + .infoWindowOffset(0, (int) getContext().getResources() + .getDimension(R.dimen.coordinatebounds_margin)); + + if (marker.getId() == 0) { + builder.flat(true); + } + + return builder.build(); + } + + private static class ViewHolder { + TextView title; + } + } + + private static class CountryAdapter extends MapboxMap.MarkerViewAdapter { + + private LayoutInflater inflater; + + public CountryAdapter(@NonNull Context context) { + super(context); + this.inflater = LayoutInflater.from(context); + } + + @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; + } + + @Override + public MarkerViewSettings getMarkerViewSettings(Marker marker) { + return new MarkerViewSettings.Builder() + .animSelectRes(R.animator.rotate_360) + .animDeselectRes(R.animator.rotate_360) + .infoWindowOffset(0, (int) getContext().getResources() + .getDimension(R.dimen.fab_margin)) + .flat(true) + .build(); + } + + private static class ViewHolder { + ImageView flag; + TextView abbrev; + } + } + + @Override + public void onResume() { + super.onResume(); + mMapView.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + mMapView.onPause(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mMapView.onSaveInstanceState(outState); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mMapView.onDestroy(); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mMapView.onLowMemory(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } +} diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/rotate_360.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/rotate_360.xml new file mode 100644 index 0000000000..e3569966d2 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/rotate_360.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_marker_bulk.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_marker_bulk.xml index 42179aa03d..90cb1a90b3 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_marker_bulk.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_marker_bulk.xml @@ -45,7 +45,6 @@ android:layout_alignParentRight="true" android:layout_gravity="end|bottom" android:layout_margin="@dimen/fab_margin" - android:src="@drawable/ic_animate_coordinates" - app:backgroundTint="@android:color/white" /> + android:src="@drawable/ic_animate_coordinates" /> 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 b15b5becd2..5d285958f1 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 @@ -1,48 +1,32 @@ - + android:layout_height="match_parent"> + android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> - - - - - - - - - - - - - - - + android:layout_height="match_parent" + android:layout_below="@id/toolbar" + app:center_latitude="38.907192" + app:center_longitude="-77.036871" + app:style_url="@string/style_mapbox_streets" + app:zoom="12" /> + + + + diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml index e9761f0cfd..a84035aa58 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml @@ -18,7 +18,6 @@ Polygon Press Map For Marker View Marker API - View Marker AP2 Standard InfoWindow example @@ -79,7 +78,6 @@ Example to make a snapshot of the map 2 maps in a view hierarchy Use an Android SDK View as marker - Use an Android SDK View as marker2 Concurrent Open InfoWindowsr Dismiss location tracking on gesture -- cgit v1.2.1