summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorTobrun <tobrun@mapbox.com>2016-05-23 12:02:51 +0200
committerTobrun <tobrun@mapbox.com>2016-05-23 12:36:55 +0200
commit98f8dd6ae6e8b14f7646f39386bdb55b0012b75c (patch)
treee98a4cb712ba4c39fb5162ddc7c98c35f2a611dc /platform
parent40bb02fe749ea8221a8da57b715bcbc1866edb8b (diff)
downloadqtlocation-mapboxgl-98f8dd6ae6e8b14f7646f39386bdb55b0012b75c.tar.gz
[android] - cleanup marker view integration
Diffstat (limited to 'platform')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java2
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java21
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java141
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewTransformer.java76
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java32
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java2
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/AnimatorUtils.java93
7 files changed, 179 insertions, 188 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java
index 467489c8a7..36d56591c8 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java
@@ -22,7 +22,7 @@ public abstract class Annotation implements Comparable<Annotation> {
* Internal C++ id is stored as unsigned int.
*/
private long id = -1; // -1 unless added to a MapView
- private MapboxMap mapboxMap;
+ protected MapboxMap mapboxMap;
protected Annotation() {
}
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
index 308ad602e1..4f88cb038f 100644
--- 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
@@ -7,6 +7,8 @@ import com.mapbox.mapboxsdk.maps.MapboxMap;
public class MarkerView extends Marker {
+ private MarkerViewManager markerViewManager;
+
private PointF centerOffset;
private Point infoWindowOffset;
private boolean flat;
@@ -16,9 +18,7 @@ public class MarkerView extends Marker {
private float tiltValue;
private float rotation;
- private float alpha;
-
- private MarkerViewTransformer markerViewTransformer;
+ private float alpha = 1;
MarkerView() {
centerOffset = new PointF();
@@ -74,18 +74,18 @@ public class MarkerView extends Marker {
this.deselectAnimRes = deselectAnimRes;
}
- public float getTiltValue() {
+ float getTilt() {
return tiltValue;
}
- public void setTiltValue(float tiltValue) {
+ void setTilt(float tiltValue) {
this.tiltValue = tiltValue;
}
public void setRotation(float rotation) {
this.rotation = rotation;
- if (markerViewTransformer != null) {
- markerViewTransformer.animateRotation(this, rotation);
+ if (markerViewManager != null) {
+ markerViewManager.animateRotation(this, rotation);
}
}
@@ -99,15 +99,14 @@ public class MarkerView extends Marker {
public void setAlpha(float alpha) {
this.alpha = alpha;
- if (markerViewTransformer != null) {
- markerViewTransformer.animateAlpha(this, rotation);
+ if (markerViewManager != null) {
+ markerViewManager.animateAlpha(this, alpha);
}
}
@Override
public void setMapboxMap(MapboxMap mapboxMap) {
super.setMapboxMap(mapboxMap);
- MarkerViewManager manager = mapboxMap.getMarkerViewManager();
- markerViewTransformer = manager.getMarkerViewTransformer();
+ markerViewManager = mapboxMap.getMarkerViewManager();
}
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java
index 8bd17a75af..aaf6a733f2 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java
@@ -1,69 +1,96 @@
package com.mapbox.mapboxsdk.annotations;
-import android.animation.Animator;
-import android.animation.AnimatorInflater;
-import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.graphics.Bitmap;
import android.graphics.Point;
+import android.graphics.PointF;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pools;
-import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.view.View;
-import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.Projection;
+import com.mapbox.mapboxsdk.utils.AnimatorUtils;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class MarkerViewManager {
+ private Map<MarkerView, View> mMarkerViewMap;
private MapboxMap mapboxMap;
private MapView mapView;
- private Context context;
private List<MapboxMap.MarkerViewAdapter> markerViewAdapters;
- private MarkerViewTransformer markerViewTransformer;
private long mViewMarkerBoundsUpdateTime;
private MapboxMap.OnMarkerViewClickListener onMarkerViewClickListener;
- private Bitmap mViewMarkerBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
public MarkerViewManager(@NonNull MapboxMap mapboxMap, @NonNull MapView mapView) {
this.mapboxMap = mapboxMap;
this.markerViewAdapters = new ArrayList<>();
- this.markerViewTransformer = new MarkerViewTransformer();
this.mapView = mapView;
- this.context = mapView.getContext().getApplicationContext();
+ mMarkerViewMap = new HashMap<>();
+ }
+
+ public void animateRotation(@NonNull MarkerView marker, float rotation) {
+ View convertView = mMarkerViewMap.get(marker);
+ if (convertView != null) {
+ AnimatorUtils.rotate(convertView, rotation);
+ }
+ }
+
+ public void animateAlpha(@NonNull MarkerView marker, float alpha) {
+ View convertView = mMarkerViewMap.get(marker);
+ if (convertView != null) {
+ AnimatorUtils.alpha(convertView, alpha);
+ }
+ }
+
+ public void update() {
+ View convertView;
+ for (MarkerView marker : mMarkerViewMap.keySet()) {
+ convertView = mMarkerViewMap.get(marker);
+ if (convertView != null) {
+ PointF point = mapboxMap.getProjection().toScreenLocation(marker.getPosition());
+ convertView.setX(point.x - (convertView.getMeasuredWidth() / 2));
+ convertView.setY(point.y - (convertView.getMeasuredHeight() / 2));
+ if (convertView.getVisibility() == View.GONE) {
+ convertView.animate().cancel();
+ convertView.setAlpha(0);
+ AnimatorUtils.alpha(convertView, 1);
+ }
+ }
+ }
+ }
+
+ public void setTilt(float tilt) {
+ View convertView;
+ for (MarkerView markerView : mMarkerViewMap.keySet()) {
+ if (markerView.isFlat()) {
+ convertView = mMarkerViewMap.get(markerView);
+ if (convertView != null) {
+ markerView.setTilt(tilt);
+ convertView.setRotationX(tilt);
+ }
+ }
+ }
}
public void deselect(@NonNull MarkerView marker) {
- final View viewMarker = markerViewTransformer.getMarkerViewMap().get(marker);
- if (viewMarker != null) {
+ final View convertView = mMarkerViewMap.get(marker);
+ if (convertView != null) {
int deselectAnimatorRes = marker.getDeselectAnimRes();
if (deselectAnimatorRes != 0) {
- viewMarker.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- Animator animator = AnimatorInflater.loadAnimator(context, deselectAnimatorRes);
- animator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- viewMarker.setLayerType(View.LAYER_TYPE_NONE, null);
- }
- });
- animator.setTarget(viewMarker);
- animator.start();
+ AnimatorUtils.animate(convertView, deselectAnimatorRes);
}
}
}
public void removeMarkerView(MarkerView marker, boolean removeFromMap) {
- final View viewHolder = markerViewTransformer.getMarkerViewMap().get(marker);
+ final View viewHolder = mMarkerViewMap.get(marker);
if (viewHolder != null && marker != null) {
for (final MapboxMap.MarkerViewAdapter<?> adapter : markerViewAdapters) {
if (adapter.getMarkerClass() == marker.getClass()) {
@@ -74,33 +101,21 @@ public class MarkerViewManager {
// cancel ongoing animations
viewHolder.animate().cancel();
viewHolder.setAlpha(1);
-
- // animate alpha
- viewHolder.animate()
- .alpha(0)
- .setDuration(MapboxConstants.ANIMATION_DURATION_SHORT)
- .setInterpolator(new FastOutSlowInInterpolator())
- .setListener(new AnimatorListenerAdapter() {
-
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- viewHolder.setVisibility(View.GONE);
- viewPool.release(viewHolder);
- }
- });
+ AnimatorUtils.alpha(viewHolder, 0, new AnimatorUtils.OnAnimationEndListener() {
+ @Override
+ public void onAnimationEnd() {
+ viewHolder.setVisibility(View.GONE);
+ viewPool.release(viewHolder);
+ }
+ });
}
}
}
if (removeFromMap) {
- markerViewTransformer.getMarkerViewMap().remove(marker);
+ mMarkerViewMap.remove(marker);
}
}
- public MarkerViewTransformer getMarkerViewTransformer() {
- return markerViewTransformer;
- }
-
public void addMarkerViewAdapter(@Nullable MapboxMap.MarkerViewAdapter markerViewAdapter) {
if (!markerViewAdapters.contains(markerViewAdapter)) {
markerViewAdapters.add(markerViewAdapter);
@@ -130,22 +145,18 @@ public class MarkerViewManager {
public void invalidateViewMarkersInBounds() {
Projection projection = mapboxMap.getProjection();
List<MarkerView> markers = mapView.getMarkerViewsInBounds(projection.getVisibleRegion().latLngBounds);
- Map<MarkerView, View> markerView = markerViewTransformer.getMarkerViewMap();
View convertView;
// remove old markers
- Iterator<MarkerView> iterator = markerView.keySet().iterator();
+ Iterator<MarkerView> iterator = mMarkerViewMap.keySet().iterator();
while (iterator.hasNext()) {
MarkerView m = iterator.next();
if (!markers.contains(m)) {
// remove marker
- convertView = markerView.get(m);
+ convertView = mMarkerViewMap.get(m);
int deselectAnimRes = m.getDeselectAnimRes();
if (deselectAnimRes != 0) {
- Animator animator = AnimatorInflater.loadAnimator(context, deselectAnimRes);
- animator.setDuration(0);
- animator.setTarget(convertView);
- animator.start();
+ AnimatorUtils.animate(convertView, deselectAnimRes, 0);
}
removeMarkerView(m, false);
iterator.remove();
@@ -154,7 +165,7 @@ public class MarkerViewManager {
// introduce new markers
for (final MarkerView marker : markers) {
- if (!markerView.containsKey(marker)) {
+ if (!mMarkerViewMap.containsKey(marker)) {
for (final MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) {
if (adapter.getMarkerClass() == marker.getClass()) {
convertView = (View) adapter.getViewReusePool().acquire();
@@ -168,20 +179,20 @@ public class MarkerViewManager {
if (adaptedView != null) {
// tilt
- adaptedView.setRotationX(marker.getTiltValue());
+ adaptedView.setRotationX(marker.getTilt());
// rotation
adaptedView.setRotation(marker.getRotation());
+ // alpha
+ adaptedView.setAlpha(marker.getAlpha());
+
if (mapboxMap.getSelectedMarkers().contains(marker)) {
// if a marker to be shown was selected
// replay that animation with duration 0
int selectAnimRes = marker.getSelectAnimRes();
if (selectAnimRes != 0) {
- Animator animator = AnimatorInflater.loadAnimator(mapView.getContext(), selectAnimRes);
- animator.setDuration(0);
- animator.setTarget(convertView);
- animator.start();
+ AnimatorUtils.animate(convertView, selectAnimRes, 0);
}
}
@@ -196,18 +207,12 @@ public class MarkerViewManager {
if (!clickHandled) {
if (animSelectRes != 0) {
- v.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- Animator animator = AnimatorInflater.loadAnimator(context, animSelectRes);
- animator.setTarget(v);
- animator.addListener(new AnimatorListenerAdapter() {
+ AnimatorUtils.animate(v, animSelectRes, new AnimatorUtils.OnAnimationEndListener() {
@Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
+ public void onAnimationEnd() {
mapboxMap.selectMarker(marker);
- v.setLayerType(View.LAYER_TYPE_NONE, null);
}
});
- animator.start();
} else {
mapboxMap.selectMarker(marker);
}
@@ -215,7 +220,7 @@ public class MarkerViewManager {
}
});
- markerView.put(marker, adaptedView);
+ mMarkerViewMap.put(marker, adaptedView);
if (convertView == null) {
mapView.addView(adaptedView);
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewTransformer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewTransformer.java
deleted file mode 100644
index 1c958d396d..0000000000
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewTransformer.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.mapbox.mapboxsdk.annotations;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.support.annotation.NonNull;
-import android.view.View;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class MarkerViewTransformer {
-
- private Map<MarkerView, View> mMarkerViewMap;
-
- public MarkerViewTransformer() {
- mMarkerViewMap = new HashMap<>();
- }
-
- /**
- * Animate the rotation of a marker view.
- *
- * @param markerView
- * @param rotation
- */
- public void animateRotation(@NonNull MarkerView markerView, float rotation) {
- final View convertView = mMarkerViewMap.get(markerView);
- if (convertView != null) {
- convertView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(convertView, View.ROTATION, convertView.getRotation(), rotation);
- rotateAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- convertView.setLayerType(View.LAYER_TYPE_NONE, null);
- }
- });
- rotateAnimator.start();
- }
- }
-
- public void animateAlpha(@NonNull MarkerView markerView, float alpha) {
- final View convertView = mMarkerViewMap.get(markerView);
- if (convertView != null) {
- convertView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(convertView, View.ALPHA, convertView.getAlpha(), alpha);
- rotateAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- convertView.setLayerType(View.LAYER_TYPE_NONE, null);
- }
- });
- rotateAnimator.start();
- }
- }
-
- /**
- * Set tilt to marker views in the viewport.
- *
- * @param tilt
- */
- public void setTilt(float tilt) {
- for (MarkerView markerView : mMarkerViewMap.keySet()) {
- if (markerView.isFlat()) {
- markerView.setTiltValue(tilt);
- mMarkerViewMap.get(markerView).setRotationX(tilt);
- }
- }
- }
-
- public Map<MarkerView, View> getMarkerViewMap() {
- return mMarkerViewMap;
- }
-
-}
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 e36429fc30..2370af505b 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
@@ -1,8 +1,6 @@
package com.mapbox.mapboxsdk.maps;
import android.Manifest;
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
@@ -35,7 +33,6 @@ import android.support.annotation.UiThread;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v4.view.ScaleGestureDetectorCompat;
-import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -98,7 +95,6 @@ import java.util.Collections;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -1362,33 +1358,7 @@ public class MapView extends FrameLayout {
mCompassView.update(getDirection());
mMyLocationView.update();
-
- Map<MarkerView, View> viewMarkers = mMapboxMap.getMarkerViewManager().getMarkerViewTransformer().getMarkerViewMap();
- for (Marker marker : viewMarkers.keySet()) {
- mViewHolder = viewMarkers.get(marker);
- if (mViewHolder != 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() == GONE) {
- mViewHolder.animate().cancel();
- mViewHolder.setAlpha(0);
- mViewHolder.animate()
- .alpha(1)
- .setDuration(MapboxConstants.ANIMATION_DURATION_SHORT)
- .setInterpolator(new FastOutSlowInInterpolator())
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- super.onAnimationStart(animation);
- mViewHolder.setVisibility(VISIBLE);
- }
- })
- .start();
- }
- }
- }
+ mMapboxMap.getMarkerViewManager().update();
for (InfoWindow infoWindow : mMapboxMap.getInfoWindows()) {
infoWindow.update();
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 bbf8307b56..09a6d592ef 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
@@ -637,7 +637,7 @@ public class MapboxMap {
//
void setTilt(double tilt) {
- mMarkerViewManager.getMarkerViewTransformer().setTilt((float) tilt);
+ mMarkerViewManager.setTilt((float) tilt);
mMapView.setTilt(tilt);
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/AnimatorUtils.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/AnimatorUtils.java
new file mode 100644
index 0000000000..495393c258
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/AnimatorUtils.java
@@ -0,0 +1,93 @@
+package com.mapbox.mapboxsdk.utils;
+
+import android.animation.Animator;
+import android.animation.AnimatorInflater;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.support.annotation.AnimatorRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.View;
+
+public class AnimatorUtils {
+
+ public static void animate(@NonNull final View view, @AnimatorRes int animatorRes, @Nullable OnAnimationEndListener listener) {
+ animate(view, animatorRes, -1, listener);
+ }
+
+ public static void animate(final View view, @AnimatorRes int animatorRes, int duration, @Nullable final OnAnimationEndListener listener) {
+ if (view == null) {
+ return;
+ }
+
+ view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ Animator animator = AnimatorInflater.loadAnimator(view.getContext(), animatorRes);
+ if (duration != -1) {
+ animator.setDuration(duration);
+ }
+
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ view.setLayerType(View.LAYER_TYPE_NONE, null);
+ if (listener != null) {
+ listener.onAnimationEnd();
+ }
+ }
+ });
+ animator.setTarget(view);
+ animator.start();
+ }
+
+ public static void animate(@NonNull final View view, @AnimatorRes int animatorRes) {
+ animate(view, animatorRes, -1);
+ }
+
+ public static void animate(@NonNull final View view, @AnimatorRes int animatorRes, int duration) {
+ animate(view, animatorRes, duration, null);
+ }
+
+ public static void rotate(@NonNull final View view, float rotation) {
+ view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(view, View.ROTATION, view.getRotation(), rotation);
+ rotateAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ view.setLayerType(View.LAYER_TYPE_NONE, null);
+ }
+ });
+ rotateAnimator.start();
+ }
+
+ public static void alpha(@NonNull final View convertView, float alpha, @Nullable final OnAnimationEndListener listener) {
+ convertView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(convertView, View.ALPHA, convertView.getAlpha(), alpha);
+ rotateAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ super.onAnimationStart(animation);
+ convertView.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ convertView.setLayerType(View.LAYER_TYPE_NONE, null);
+ if (listener != null) {
+ listener.onAnimationEnd();
+ }
+ }
+ });
+ rotateAnimator.start();
+ }
+
+ public static void alpha(@NonNull final View convertView, float alpha) {
+ alpha(convertView, alpha, null);
+ }
+
+ public interface OnAnimationEndListener {
+ void onAnimationEnd();
+ }
+}