diff options
author | Tobrun <tobrun@mapbox.com> | 2016-05-11 14:43:17 +0200 |
---|---|---|
committer | Tobrun <tobrun@mapbox.com> | 2016-05-20 12:00:03 +0200 |
commit | db2c3e59e34c8981e468a1835a064e1c1bbc252e (patch) | |
tree | 2bc6b2e5c0a37dc01fd81b36dd0992da5ce8ed00 /platform | |
parent | 8e57b455c5206cc12f6650051a61351f55ee85d1 (diff) | |
download | qtlocation-mapboxgl-db2c3e59e34c8981e468a1835a064e1c1bbc252e.tar.gz |
[android] #3276 - added item animation for select/deselect state of a View Marker. Removed asynctask due to unneeded overhead. Improved integration with selectMarker. Added item animators for the test app.
Diffstat (limited to 'platform')
6 files changed, 148 insertions, 88 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 da487190ca..02b2298948 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 @@ -469,7 +469,7 @@ public class MapView extends FrameLayout { } } - void invalidateViewMarkers(){ + void invalidateViewMarkers() { long currentTime = SystemClock.elapsedRealtime(); if (mViewMarkersUpdateRunning || currentTime < mViewMarkerBoundsUpdateTime) { @@ -477,101 +477,84 @@ public class MapView extends FrameLayout { } mViewMarkerBoundsUpdateTime = currentTime + 300; -// new ViewMarkerInBoundsTask().execute(); -// } -// public class ViewMarkerInBoundsTask extends AsyncTask<Void, Void, ViewMarkerInBoundsTask.Result> { -// -// @Override -// protected void onPreExecute() { -// super.onPreExecute(); - mViewMarkersUpdateRunning = true; -// } + mViewMarkersUpdateRunning = true; -// @Override -// protected Result doInBackground(Void... params) { - List<Marker> inBounds = new ArrayList<>(); - Map<Marker, View> outBounds = new HashMap<>(); + List<Marker> inBounds = new ArrayList<>(); + Map<Marker, View> outBounds = new HashMap<>(); - LatLngBounds bounds = mMapboxMap.getProjection().getVisibleRegion().latLngBounds; - long[] ids = mNativeMapView.getAnnotationsInBounds(bounds); - LongSparseArray<View> markerViews = mMapboxMap.getMarkerViews(); - Log.v(MapboxConstants.TAG, "Annotations in bounds: " + ids.length); + LatLngBounds bounds = mMapboxMap.getProjection().getVisibleRegion().latLngBounds; + long[] ids = mNativeMapView.getAnnotationsInBounds(bounds); + LongSparseArray<View> markerViews = mMapboxMap.getMarkerViews(); + Log.v(MapboxConstants.TAG, "Annotations in bounds: " + ids.length); - boolean found; - long key; + 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); + // 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 (id == key) { + found = true; } + } - if (!found) { - Annotation annotation = mMapboxMap.getAnnotation(id); - if (annotation instanceof Marker) { - inBounds.add((Marker) annotation); - } else { - Log.v(MapboxConstants.TAG, "Not instance of Marker" + id); - } + if (!found) { + Annotation annotation = mMapboxMap.getAnnotation(id); + if (annotation instanceof Marker) { + inBounds.add((Marker) annotation); } else { - Log.v(MapboxConstants.TAG, "Already added " + id); + Log.v(MapboxConstants.TAG, "Not instance of Marker" + id); } + } 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; - } + // 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) { - Annotation annotation = mMapboxMap.getAnnotation(key); - if (annotation instanceof Marker) { - outBounds.put((Marker) annotation, markerViews.get(key)); - } else { - Log.v(MapboxConstants.TAG, "Not instance of Marker" + key); - } + } + if (!found) { + Annotation annotation = mMapboxMap.getAnnotation(key); + if (annotation instanceof Marker) { + outBounds.put((Marker) annotation, markerViews.get(key)); + } else { + Log.v(MapboxConstants.TAG, "Not instance of Marker" + key); } } + } Result result = new Result(inBounds, outBounds); + mMapboxMap.setViewMarkersBoundsTaskResult(result); + mViewMarkersUpdateRunning = false; + Log.v(MapboxConstants.TAG, "Amount of child views " + getChildCount()); + } -// return new Result(inBounds, outBounds); -// } + public class Result { + private List<Marker> inBounds; + private Map<Marker, View> outBounds; -// @Override -// protected void onPostExecute(Result result) { -// super.onPostExecute(result); - mMapboxMap.setViewMarkersBoundsTaskResult(result); - mViewMarkersUpdateRunning = false; - Log.v(MapboxConstants.TAG, "Amount of child views " + getChildCount()); + public Result(List<Marker> inBounds, Map<Marker, View> outBounds) { + this.inBounds = inBounds; + this.outBounds = outBounds; } - public class Result { - private List<Marker> inBounds; - private Map<Marker, View> outBounds; - - public Result(List<Marker> inBounds, Map<Marker, View> outBounds) { - this.inBounds = inBounds; - this.outBounds = outBounds; - } - - public List<Marker> getInBounds() { - return inBounds; - } + public List<Marker> getInBounds() { + return inBounds; + } - public Map<Marker, View> getOutBounds() { - return outBounds; - } + public Map<Marker, View> getOutBounds() { + return outBounds; } + } // } /** @@ -1456,7 +1439,7 @@ public class MapView extends FrameLayout { mViewHolder = viewMarkers.valueAt(i); if (mViewHolder != null) { Marker marker = (Marker) mMapboxMap.getAnnotation(viewMarkers.keyAt(i)); - if(marker!=null) { + if (marker != null) { PointF point = mMapboxMap.getProjection().toScreenLocation(marker.getPosition()); mViewHolder.setX(point.x - (mViewHolder.getMeasuredWidth() / 2)); mViewHolder.setY(point.y - (mViewHolder.getMeasuredHeight() / 2)); 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 8189731ebe..69a025733f 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 @@ -1,9 +1,14 @@ package com.mapbox.mapboxsdk.maps; import android.content.Context; +import android.animation.Animator; +import android.animation.AnimatorInflater; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.graphics.Bitmap; 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; @@ -17,6 +22,7 @@ import android.view.View; import com.mapbox.mapboxsdk.MapboxAccountManager; import android.view.ViewGroup; +import android.view.animation.Animation; import com.mapbox.mapboxsdk.annotations.Annotation; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; @@ -68,12 +74,15 @@ public class MapboxMap { private List<Marker> mSelectedMarkers; private LongSparseArray<View> mMarkerViews; - private List<InfoWindow> mInfoWindows; + private List<InfoWindow> mInfoWindows; private MapboxMap.InfoWindowAdapter mInfoWindowAdapter; + private MapboxMap.MarkerViewAdapter mMarkerViewAdapter; - private Bitmap mViewMarkerBitmap; private OnMarkerViewClickListener mOnMarkerViewClickListener; + private int mMarkerViewItemAnimatorInRes; + private int mMarkerViewItemAnimatorOutRes; + private Bitmap mViewMarkerBitmap; private boolean mMyLocationEnabled; private boolean mAllowConcurrentMultipleInfoWindows; @@ -660,7 +669,7 @@ public class MapboxMap { if (adaptedView != null) { // hack to hide old marker, todo replace with visibility Icon icon = marker.getIcon(); - if(!icon.getBitmap().equals(mViewMarkerBitmap)) { + if (!icon.getBitmap().equals(mViewMarkerBitmap)) { if (mViewMarkerBitmap == null) { Bitmap.Config conf = Bitmap.Config.ARGB_8888; mViewMarkerBitmap = Bitmap.createBitmap(icon.getBitmap().getWidth(), icon.getBitmap().getHeight(), conf); @@ -671,15 +680,27 @@ public class MapboxMap { @Override public void onClick(View v) { - if (mSelectedMarkers.contains(marker)) { - return; - } - + boolean clickHandled = false; if (mOnMarkerViewClickListener != null) { - mOnMarkerViewClickListener.onMarkerClick(marker, v); + clickHandled = mOnMarkerViewClickListener.onMarkerClick(marker, v); } - mSelectedMarkers.add(marker); + if (!clickHandled) { + if (mMarkerViewItemAnimatorInRes != 0) { + Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(),mMarkerViewItemAnimatorInRes); + animator.setTarget(v); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + selectMarker(marker); + } + }); + animator.start(); + } else { + selectMarker(marker); + } + } } }); @@ -1184,6 +1205,13 @@ public class MapboxMap { if (marker.isInfoWindowShown()) { marker.hideInfoWindow(); } + + View viewMarker = mMarkerViews.get(marker.getId()); + if(viewMarker!=null){ + Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(),mMarkerViewItemAnimatorOutRes); + animator.setTarget(viewMarker); + animator.start(); + } } // Removes all selected markers from the list @@ -1242,6 +1270,21 @@ public class MapboxMap { return mOnMarkerViewClickListener; } + public void setMarkerViewItemAnimation(@AnimatorRes int animationInRes,@AnimatorRes int animationOutRes) { + mMarkerViewItemAnimatorInRes = animationInRes; + mMarkerViewItemAnimatorOutRes = animationOutRes; + } + + @AnimatorRes + public int getMarkerViewItemAnimatorInRes() { + return mMarkerViewItemAnimatorInRes; + } + + @AnimatorRes + public int getMarkerViewItemAnimatorOutRes() { + return mMarkerViewItemAnimatorOutRes; + } + // // InfoWindow // @@ -1838,7 +1881,7 @@ public class MapboxMap { public interface OnMarkerViewClickListener { - void onMarkerClick(@NonNull Marker marker, @NonNull View view); + boolean onMarkerClick(@NonNull Marker marker, @NonNull View view); } /** 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 34b34f62ce..559df05b30 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 @@ -1,5 +1,9 @@ package com.mapbox.mapboxsdk.testapp.activity.annotation; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; @@ -8,16 +12,20 @@ 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.view.ViewPropertyAnimatorCompatSet; 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.view.ViewPropertyAnimator; +import android.view.animation.BounceInterpolator; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; +import android.widget.Toast; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; import com.mapbox.mapboxsdk.annotations.Marker; @@ -92,10 +100,13 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView } } }); + + mMapboxMap.setMarkerViewItemAnimation(R.animator.scale_up, R.animator.scale_down); mMapboxMap.setOnMarkerViewClickListener(new MapboxMap.OnMarkerViewClickListener() { @Override - public void onMarkerClick(@NonNull Marker marker, @NonNull View view) { - mMapboxMap.selectMarker(marker); + public boolean onMarkerClick(@NonNull final Marker marker, @NonNull View view) { + Toast.makeText(BulkMarkerActivity.this, "Hello "+marker.getId(), Toast.LENGTH_SHORT).show(); + return false; } }); } 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 735ab8088f..651cfcebf1 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 @@ -68,8 +68,9 @@ public class ViewMarkerActivity extends AppCompatActivity implements OnMapReadyC mapboxMap.setMarkerViewAdapter(new CountryAdapter(this)); mapboxMap.setOnMarkerViewClickListener(new MapboxMap.OnMarkerViewClickListener() { @Override - public void onMarkerClick(@NonNull Marker marker, @NonNull View view) { + public boolean onMarkerClick(@NonNull Marker marker, @NonNull View view) { Log.d(MapboxConstants.TAG, "Country clicked " + ((CountryMarker) marker).getAbbrevName()); + return true; } }); diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/scale_down.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/scale_down.xml new file mode 100644 index 0000000000..d1067b09c2 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/scale_down.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android"> + <objectAnimator + android:propertyName="scaleX" + android:duration="300" + android:valueTo="1"/> + <objectAnimator + android:propertyName="scaleY" + android:duration="300" + android:valueTo="1"/> +</set>
\ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/scale_up.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/scale_up.xml new file mode 100644 index 0000000000..b43ed05513 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/scale_up.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android"> + <objectAnimator + android:propertyName="scaleX" + android:duration="300" + android:valueTo="2"/> + <objectAnimator + android:propertyName="scaleY" + android:duration="300" + android:valueTo="2"/> +</set>
\ No newline at end of file |