下面列出了android.view.ViewPropertyAnimator#setListener ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Animates a tab to be swiped horizontally.
*
* @param tabItem
* The tab item, which corresponds to the tab, which should be swiped, as an instance of
* the class {@link TabItem}. The tab item may not be null
* @param targetPosition
* The position on the x-axis, the tab should be moved to, in pixels as a {@link Float}
* value
* @param selected
* True, if the tab should become the selected one, false otherwise
* @param animationDuration
* The duration of the animation in milliseconds as a {@link Long} value
* @param velocity
* The velocity of the drag gesture, which caused the tab to be swiped, in pixels per
* second as a {@link Float} value
*/
private void animateSwipe(@NonNull final TabItem tabItem, final float targetPosition,
final boolean selected, final long animationDuration,
final float velocity) {
View view = tabItem.getView();
float currentPosition = getArithmetics().getPosition(Axis.X_AXIS, tabItem);
float distance = Math.abs(targetPosition - currentPosition);
float maxDistance = getArithmetics().getSize(Axis.X_AXIS, tabItem) + swipedTabDistance;
long duration = velocity > 0 ? Math.round((distance / velocity) * 1000) :
Math.round(animationDuration * (distance / maxDistance));
ViewPropertyAnimator animation = view.animate();
animation.setListener(new AnimationListenerWrapper(
selected ? createSwipeSelectedTabAnimationListener(tabItem) :
createSwipeNeighborAnimationListener(tabItem)));
animation.setInterpolator(new AccelerateDecelerateInterpolator());
animation.setDuration(duration);
animation.setStartDelay(0);
getArithmetics().animatePosition(Axis.X_AXIS, animation, tabItem, targetPosition, true);
animation.start();
}
/**
* Starts a reveal animation to add a specific tab.
*
* @param item
* The item, which corresponds to the tab, which should be added, as an instance of the
* class {@link AbstractItem}. The item may not be null
* @param revealAnimation
* The reveal animation, which should be started, as an instance of the class {@link
* RevealAnimation}. The reveal animation may not be null
*/
private void animateReveal(@NonNull final AbstractItem item,
@NonNull final RevealAnimation revealAnimation) {
tabViewBottomMargin = -1;
tabRecyclerAdapter.clearCachedPreviews();
dragHandler.setCallback(null);
View view = item.getView();
ViewPropertyAnimator animation = view.animate();
animation.setInterpolator(
revealAnimation.getInterpolator() != null ? revealAnimation.getInterpolator() :
new AccelerateDecelerateInterpolator());
animation.setListener(new AnimationListenerWrapper(createHideSwitcherAnimationListener()));
animation.setStartDelay(0);
animation.setDuration(revealAnimation.getDuration() != -1 ? revealAnimation.getDuration() :
revealAnimationDuration);
getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation, 1);
getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation, 1);
animation.start();
animateToolbarVisibility(getModel().areToolbarsShown() && getModel().isEmpty(), 0);
}
private void rotate(final View v, boolean reverse) {
ViewPropertyAnimator animator = v.animate().setDuration(500).rotation(reverse ? -360 : 360);
animator.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
v.setRotation(0);
}
});
animator.start();
}
public static void startAnimators(final View view, int startOffsetX, int startOffsetY, long delay) {
if (view.getVisibility() == View.VISIBLE && view.getAlpha() != 0f) {
view.clearAnimation();
view.animate().cancel();
final Resources res = view.getResources();
final float endAlpha = view.getAlpha();
final float endTranslateX = view.getTranslationX();
final float endTranslateY = view.getTranslationY();
view.setAlpha(0);
final Animator fade = ObjectAnimator.ofFloat(view, View.ALPHA, endAlpha);
fade.setDuration(res.getInteger(R.integer.material_in_fade_anim_duration));
fade.setInterpolator(new AccelerateInterpolator());
fade.setStartDelay(delay);
fade.start();
ViewPropertyAnimator slide = view.animate();
if (startOffsetY != 0) {
view.setTranslationY(startOffsetY);
slide.translationY(endTranslateY);
} else {
view.setTranslationX(startOffsetX);
slide.translationX(endTranslateX);
}
slide.setInterpolator(new DecelerateInterpolator(2));
slide.setDuration(res.getInteger(R.integer.material_in_slide_anim_duration));
slide.setStartDelay(delay);
slide.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
if (fade.isStarted()) {
fade.cancel();
}
view.setAlpha(endAlpha);
view.setTranslationX(endTranslateX);
view.setTranslationY(endTranslateY);
}
});
slide.start();
}
}
/**
* Animates the position and size of a specific tab in order to hide the tab switcher.
*
* @param item
* The item, which corresponds to the tab, which should be animated, as an instance of
* the class {@link AbstractItem}. The item may not be null
* @param duration
* The duration of the animation in milliseconds as a {@link Long} value
* @param interpolator
* The interpolator, which should be used by the animation, as an instance of the class
* {@link Interpolator}. The interpolator may not be null
* @param delay
* The delay of the animation in milliseconds as a {@link Long} value
* @param listener
* The listener, which should be notified about the animation's progress, as an instance
* of the type {@link AnimatorListener} or null, if no listener should be notified
*/
private void animateHideSwitcher(@NonNull final AbstractItem item, final long duration,
@NonNull final Interpolator interpolator, final long delay,
@Nullable final AnimatorListener listener) {
View view = item.getView();
animateBottomMargin(view, -(tabInset + tabBorderWidth), duration, delay);
ViewPropertyAnimator animation = view.animate();
animation.setDuration(duration);
animation.setInterpolator(interpolator);
animation.setListener(new AnimationListenerWrapper(listener));
getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation, 1);
getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation, 1);
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams();
getArithmetics().animatePosition(Axis.ORTHOGONAL_AXIS, animation, item,
getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE ? layoutParams.topMargin :
0);
int selectedTabIndex = getModel().getSelectedTabIndex();
if (item.getIndex() < selectedTabIndex) {
getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animation, item,
getArithmetics().getTabContainerSize(Axis.DRAGGING_AXIS));
} else if (item.getIndex() > selectedTabIndex) {
getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animation, item,
getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE ? 0 :
layoutParams.topMargin);
} else {
getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animation, item,
getTabSwitcher().getLayout() == Layout.PHONE_LANDSCAPE ? 0 :
layoutParams.topMargin);
}
animation.setStartDelay(delay);
animation.start();
}
/**
* Animates the position, size and alpha of a specific tab in order to swipe it orthogonally.
*
* @param item
* The item, corresponds to the tab, which should be animated, as an instance of the
* class {@link AbstractItem}. The item may not be null
* @param remove
* True, if the tab should be removed after the animation has finished, false otherwise
* @param delayMultiplier
* The multiplied, which should be used to calculate the delay after which the animation
* should be started, by being multiplied with the default delay, as an {@link Integer}
* value
* @param swipeAnimation
* The animation, which should be used, as an instance of the class {@link
* SwipeAnimation}. The animation may not be null
* @param listener
* The listener, which should be notified about the progress of the animation, as an
* instance of the type {@link AnimatorListener} or null, if no listener should be
* notified
*/
private void animateSwipe(@NonNull final AbstractItem item, final boolean remove,
final int delayMultiplier,
@NonNull final SwipeAnimation swipeAnimation,
@Nullable final AnimatorListener listener) {
View view = item.getView();
float currentScale = getArithmetics().getScale(item, true);
float swipePosition = calculateSwipePosition();
float targetPosition = remove ?
(swipeAnimation.getDirection() == SwipeDirection.LEFT_OR_TOP ? -1 * swipePosition :
swipePosition) : 0;
float currentPosition = getArithmetics().getPosition(Axis.ORTHOGONAL_AXIS, item);
float distance = Math.abs(targetPosition - currentPosition);
long animationDuration = swipeAnimation.getDuration() != -1 ? swipeAnimation.getDuration() :
Math.round(swipeAnimationDuration * (distance / swipePosition));
ViewPropertyAnimator animation = view.animate();
animation.setInterpolator(
swipeAnimation.getInterpolator() != null ? swipeAnimation.getInterpolator() :
new AccelerateDecelerateInterpolator());
animation.setListener(new AnimationListenerWrapper(listener));
animation.setDuration(animationDuration);
getArithmetics()
.animatePosition(Axis.ORTHOGONAL_AXIS, animation, item, targetPosition, true);
getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation,
remove ? swipedTabScale * currentScale : currentScale);
getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation,
remove ? swipedTabScale * currentScale : currentScale);
animation.alpha(remove ? swipedTabAlpha : 1);
animation.setStartDelay(delayMultiplier * calculateAnimationDelay(animationDuration));
animation.start();
}
/**
* Animates to rotation of all tabs to be reset to normal.
*
* @param interpolator
* The interpolator, which should be used by the animation, as an instance of the type
* {@link Interpolator}. The interpolator may not be null
* @param maxAngle
* The angle, the tabs may be rotated by at maximum, in degrees as a {@link Float}
* value
* @param listener
* The listener, which should be notified about the animation's progress, as an instance
* of the type {@link AnimatorListener} or null, if no listener should be notified
* @return True, if at least one tab was animated, false otherwise
*/
private boolean animateTilt(@NonNull final Interpolator interpolator, final float maxAngle,
@Nullable final AnimatorListener listener) {
ItemIterator iterator =
new ItemIterator.Builder(getTabSwitcher(), tabViewRecycler).reverse(true).create();
AbstractItem item;
boolean result = false;
while ((item = iterator.next()) != null) {
if (item.isInflated() &&
getArithmetics().getRotation(Axis.ORTHOGONAL_AXIS, item) != 0) {
View view = item.getView();
ViewPropertyAnimator animation = view.animate();
animation.setListener(new AnimationListenerWrapper(
createRevertOvershootAnimationListener(item, !result ? listener : null)));
animation.setDuration(Math.round(revertOvershootAnimationDuration *
(Math.abs(getArithmetics().getRotation(Axis.ORTHOGONAL_AXIS, item)) /
maxAngle)));
animation.setInterpolator(interpolator);
getArithmetics().animateRotation(Axis.ORTHOGONAL_AXIS, animation, 0);
animation.setStartDelay(0);
animation.start();
result = true;
}
}
return result;
}
/**
* Starts a peek animation to add a specific tab.
*
* @param item
* The item, which corresponds to the tab, which should be added, as an instance of the
* class {@link AbstractItem}. The item may not be null
* @param duration
* The duration of the animation in milliseconds as a {@link Long} value
* @param interpolator
* The interpolator, which should be used by the animation, as an instance of the type
* {@link Interpolator}. The interpolator may not be null
* @param peekPosition
* The position on the dragging axis, the tab should be moved to, in pixels as a {@link
* Float} value
* @param peekAnimation
* The peek animation, which has been used to add the tab, as an instance of the class
* {@link PeekAnimation}. The peek animation may not be null
*/
private void animatePeek(@NonNull final AbstractItem item, final long duration,
@NonNull final Interpolator interpolator, final float peekPosition,
@NonNull final PeekAnimation peekAnimation) {
PhoneTabViewHolder viewHolder = (PhoneTabViewHolder) ((TabItem) item).getViewHolder();
viewHolder.closeButton.setVisibility(View.GONE);
View view = item.getView();
float x = peekAnimation.getX();
float y = peekAnimation.getY() + tabTitleContainerHeight;
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams();
view.setAlpha(1f);
getArithmetics().setPivot(Axis.X_AXIS, item, x);
getArithmetics().setPivot(Axis.Y_AXIS, item, y);
view.setX(layoutParams.leftMargin);
view.setY(layoutParams.topMargin);
getArithmetics().setScale(Axis.DRAGGING_AXIS, item, 0);
getArithmetics().setScale(Axis.ORTHOGONAL_AXIS, item, 0);
ViewPropertyAnimator animation = view.animate();
animation.setInterpolator(interpolator);
animation.setListener(
new AnimationListenerWrapper(createPeekAnimationListener(item, peekAnimation)));
animation.setStartDelay(0);
animation.setDuration(duration);
getArithmetics().animateScale(Axis.DRAGGING_AXIS, animation, 1);
getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animation, 1);
getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animation, item, peekPosition, true);
animation.start();
int selectedTabIndex = getModel().getSelectedTabIndex();
TabItem selectedItem = TabItem.create(getModel(), tabViewRecycler, selectedTabIndex);
tabViewRecycler.inflate(selectedItem);
selectedItem.getTag().setPosition(0);
PhoneTabViewHolder selectedTabViewHolder =
(PhoneTabViewHolder) selectedItem.getViewHolder();
selectedTabViewHolder.closeButton.setVisibility(View.GONE);
animateShowSwitcher(selectedItem, duration, interpolator,
createZoomOutAnimationListener(selectedItem, peekAnimation));
}
/**
* Creates and returns an animation listener, which allows to hide a tab, which has been added
* by using a peek animation, when the animation has been ended.
*
* @param item
* The item, which corresponds to the tab, which has been added by using the peek
* animation, as an instance of the class {@link AbstractItem}. The item may not be
* null
* @param peekAnimation
* The peek animation as an instance of the class {@link PeekAnimation}. The peek
* animation may not be null
* @return The listener, which has been created, as an instance of the type {@link
* AnimatorListener}. The listener may not be null
*/
@NonNull
private AnimatorListener createPeekAnimationListener(@NonNull final AbstractItem item,
@NonNull final PeekAnimation peekAnimation) {
return new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(final Animator animation) {
super.onAnimationEnd(animation);
long totalDuration =
peekAnimation.getDuration() != -1 ? peekAnimation.getDuration() :
peekAnimationDuration;
long duration = totalDuration / 3;
Interpolator interpolator =
peekAnimation.getInterpolator() != null ? peekAnimation.getInterpolator() :
new AccelerateDecelerateInterpolator();
View view = item.getView();
getArithmetics().setPivot(Axis.DRAGGING_AXIS, item, tabTitleContainerHeight);
getArithmetics().setPivot(Axis.ORTHOGONAL_AXIS, item,
getArithmetics().getSize(Axis.ORTHOGONAL_AXIS, item) / 2f);
ViewPropertyAnimator animator = view.animate();
animator.setDuration(duration);
animator.setStartDelay(duration);
animator.setInterpolator(interpolator);
animator.setListener(
new AnimationListenerWrapper(createRevertPeekAnimationListener(item)));
animator.alpha(0);
getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animator, item,
getArithmetics().getPosition(Axis.DRAGGING_AXIS, item) * 1.5f);
getArithmetics().animateScale(Axis.DRAGGING_AXIS, animator, 0);
getArithmetics().animateScale(Axis.ORTHOGONAL_AXIS, animator, 0);
animator.start();
}
};
}
@Override
public void onBackPressed() {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
&& isAuthorAnimationRequired
&& !authorAnimationInProgress
&& !AnimationUtils.isViewHiddenByScale(authorImageView)) {
ViewPropertyAnimator hideAuthorAnimator = com.rozdoum.socialcomponents.utils.AnimationUtils.hideViewByScale(authorImageView);
hideAuthorAnimator.setListener(authorAnimatorListener);
hideAuthorAnimator.withEndAction(PostDetailsActivity.this::onBackPressed);
} else {
super.onBackPressed();
}
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void animateClose() {
mBalloonMarkerDrawable.stop();
ViewPropertyAnimator animator = mNumber.animate();
animator.alpha(0f);
animator.setDuration(100);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
animator.withEndAction(new Runnable() {
@Override
public void run() {
//We use INVISIBLE instead of GONE to avoid a requestLayout
mNumber.setVisibility(View.INVISIBLE);
mBalloonMarkerDrawable.animateToNormal();
}
});
} else {
animator.setListener(new AnimatorListener() {
@Override
public void onAnimationEnd(Animator animation) {
//We use INVISIBLE instead of GONE to avoid a requestLayout
mNumber.setVisibility(View.INVISIBLE);
mBalloonMarkerDrawable.animateToNormal();
}
});
}
animator.start();
}
private void startExitAnimation(final Runnable onAnimationNearlyEnded) {
Interpolator interpolator = new AccelerateInterpolator();
final View viewForAnimationNearlyEnded = mExitAnimationViews.get(5);
for (int i = 0; i < mExitAnimationViews.size(); ++i) {
final View v = mExitAnimationViews.get(i);
v.setAlpha(1f);
v.setTranslationY(0);
ViewPropertyAnimator animator = v.animate();
if (v == viewForAnimationNearlyEnded) {
animator.setListener(new AnimatorEndWithoutCancelListener() {
@Override
public void onAnimationEndWithoutCancel() {
onAnimationNearlyEnded.run();
}
});
}
animator
.withLayer()
.alpha(0.0f)
.translationY(-75)
.setInterpolator(interpolator)
.setStartDelay(mAnimStaggerDelay * i)
.setDuration(mAnimShortDuration)
.start();
}
mFavoriteBtn.animate()
.withLayer()
.scaleX(0f)
.scaleY(0f)
.setInterpolator(interpolator)
.setDuration(mAnimShortDuration)
.start();
}
private void updateLocationDrawable() {
logger.debug("updateLocationDrawable()");
if (mViews.recordButton.getTag() != mTrackingState) {
int recordColor = mTrackingState == TRACKING_STATE.TRACKING ? mColorAccent : mColorActionIcon;
mViews.recordButton.getDrawable().setTint(recordColor);
mViews.recordButton.setTag(mTrackingState);
}
if (mViews.locationButton.getTag() == mLocationState)
return;
if (mViews.locationButton.getTag() == LocationState.SEARCHING) {
mViews.locationButton.clearAnimation();
mViews.satellites.animate().translationY(-200);
}
final ViewPropertyAnimator gaugePanelAnimator = mViews.gaugePanel.animate();
gaugePanelAnimator.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (mLocationState == LocationState.NORTH)
HelperUtils.showTargetedAdvice(MainActivity.this, Configuration.ADVICE_MORE_GAUGES, R.string.advice_more_gauges, mViews.gaugePanel, true);
//HelperUtils.showAdvice(Configuration.ADVICE_MORE_GAUGES, R.string.advice_more_gauges, mViews.coordinatorLayout);
if (mLocationState == LocationState.SEARCHING)
mViews.satellites.animate().translationY(8);
gaugePanelAnimator.setListener(null);
updateMapViewArea();
}
});
switch (mLocationState) {
case DISABLED:
mNavigationNorthDrawable.setTint(mColorActionIcon);
mViews.locationButton.setImageDrawable(mNavigationNorthDrawable);
mCrosshairLayer.setEnabled(true);
if (mViews.gaugePanel.getWidth() > 0) {
gaugePanelAnimator.translationX(-mViews.gaugePanel.getWidth());
mViews.gaugePanel.onVisibilityChanged(false);
}
break;
case SEARCHING:
mLocationSearchingDrawable.setTint(mColorAccent);
mViews.locationButton.setImageDrawable(mLocationSearchingDrawable);
Animation rotation = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotation.setInterpolator(new LinearInterpolator());
rotation.setRepeatCount(Animation.INFINITE);
rotation.setDuration(1000);
mViews.locationButton.startAnimation(rotation);
if (mViews.gaugePanel.getVisibility() == View.INVISIBLE) {
mViews.satellites.animate().translationY(8);
} else {
gaugePanelAnimator.translationX(-mViews.gaugePanel.getWidth());
mViews.gaugePanel.onVisibilityChanged(false);
}
break;
case ENABLED:
mMyLocationDrawable.setTint(mColorActionIcon);
mViews.locationButton.setImageDrawable(mMyLocationDrawable);
mCrosshairLayer.setEnabled(true);
gaugePanelAnimator.translationX(-mViews.gaugePanel.getWidth());
mViews.gaugePanel.onVisibilityChanged(false);
break;
case NORTH:
mNavigationNorthDrawable.setTint(mColorAccent);
mViews.locationButton.setImageDrawable(mNavigationNorthDrawable);
mCrosshairLayer.setEnabled(false);
gaugePanelAnimator.translationX(0);
mViews.gaugePanel.onVisibilityChanged(true);
break;
case TRACK:
mNavigationTrackDrawable.setTint(mColorAccent);
mViews.locationButton.setImageDrawable(mNavigationTrackDrawable);
mCrosshairLayer.setEnabled(false);
gaugePanelAnimator.translationX(0);
mViews.gaugePanel.onVisibilityChanged(true);
}
mViews.locationButton.setTag(mLocationState);
for (WeakReference<LocationStateChangeListener> weakRef : mLocationStateChangeListeners) {
LocationStateChangeListener locationStateChangeListener = weakRef.get();
if (locationStateChangeListener != null) {
locationStateChangeListener.onLocationStateChanged(mLocationState);
}
}
}
public FirstFrameAnimatorHelper(ViewPropertyAnimator vpa, View target) {
mTarget = target;
vpa.setListener(this);
}
public FirstFrameAnimatorHelper(ViewPropertyAnimator vpa, View target) {
mTarget = target;
vpa.setListener(this);
}
/**
* Animates the position of a specific tab in order to relocate it.
*
* @param item
* The item, which corresponds to the tab, which should be animated, as an instance of
* the class {@link AbstractItem}. The item may not be null
* @param position
* The position, the tab should be relocated to, in pixels as a {@link Float} value
* @param tag
* The tag, which should be applied to the given item, as an instance of the class
* {@link Tag} or null, if no tag should be applied
* @param delayMultiplier
* The multiplier, which should be used to calculate the delay of the relocate
* animation, by being multiplied with the default delay, as an {@link Integer} value
* @param listener
* The listener, which should be notified about the progress of the relocate animation,
* as an instance of the type {@link AnimatorListener} or null, if no listener should be
* notified
* @param swipeAnimation
* The animation, which has been used to add or remove the tab, which caused the other
* tabs to be relocated, as an instance of the class {@link SwipeAnimation}. The
* animation may not be null
*/
private void animateRelocate(@NonNull final AbstractItem item, final float position,
@Nullable final Tag tag, final int delayMultiplier,
@Nullable final AnimatorListener listener,
@NonNull final SwipeAnimation swipeAnimation) {
if (tag != null) {
item.getView().setTag(R.id.tag_properties, tag);
item.setTag(tag);
}
View view = item.getView();
long animationDuration = swipeAnimation.getRelocateAnimationDuration() != -1 ?
swipeAnimation.getRelocateAnimationDuration() : relocateAnimationDuration;
ViewPropertyAnimator animation = view.animate();
animation.setListener(new AnimationListenerWrapper(listener));
animation.setInterpolator(new AccelerateDecelerateInterpolator());
animation.setDuration(animationDuration);
getArithmetics().animatePosition(Axis.DRAGGING_AXIS, animation, item, position, true);
animation.setStartDelay(delayMultiplier * calculateAnimationDelay(animationDuration));
animation.start();
}
public FirstFrameAnimatorHelper(ViewPropertyAnimator vpa, View target) {
mTarget = target;
vpa.setListener(this);
}
/**
* Shows a view by scaling
*
* @param v the view to be scaled
*
* @return the ViewPropertyAnimation to manage the animation
*/
public static ViewPropertyAnimator showViewByScaleY (View v, AnimatorListener animatorListener) {
ViewPropertyAnimator propertyAnimator = v.animate().setStartDelay(SCALE_DELAY)
.scaleY(1);
propertyAnimator.setListener(animatorListener);
return propertyAnimator;
}
public static ViewPropertyAnimator showViewByScale (View v, AnimatorListener animatorListener) {
ViewPropertyAnimator propertyAnimator = v.animate().setStartDelay(SCALE_DELAY)
.scaleY(1).scaleX(1);
propertyAnimator.setListener(animatorListener);
return propertyAnimator;
}
public static void hideScaleAnimationFromPivot(View v, AnimatorListener animatorListener) {
ViewPropertyAnimator viewPropertyAnimator = v.animate()
.setInterpolator(new AccelerateDecelerateInterpolator())
.scaleY(SCALE_START_ANCHOR)
.setDuration(SCALE_DELAY);
if (animatorListener != null)
viewPropertyAnimator.setListener(animatorListener);
viewPropertyAnimator.start();
}