summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorTobrun <tobrun@mapbox.com>2016-05-11 14:43:17 +0200
committerTobrun <tobrun@mapbox.com>2016-05-20 12:00:03 +0200
commitdb2c3e59e34c8981e468a1835a064e1c1bbc252e (patch)
tree2bc6b2e5c0a37dc01fd81b36dd0992da5ce8ed00 /platform
parent8e57b455c5206cc12f6650051a61351f55ee85d1 (diff)
downloadqtlocation-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')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java133
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java63
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java15
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java3
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/scale_down.xml11
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/res/animator/scale_up.xml11
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