List of usage examples for android.support.v4.animation AnimatorCompatHelper emptyValueAnimator
public static ValueAnimatorCompat emptyValueAnimator()
From source file:br.com.devmix.baseapp.listener.OnSwipeableRecyclerViewTouchListener.java
private void performDismiss(final View dismissView, final int dismissPosition) { // Animate the dismissed list item to zero-height and fire the dismiss callback when // all dismissed list item animations have completed. This triggers layout on each animation // frame; in the future we may want to do something smarter and more performant. final ViewGroup.LayoutParams lp = dismissView.getLayoutParams(); final int originalLayoutParamsHeight = lp.height; final int originalHeight = dismissView.getHeight(); ValueAnimatorCompat animatorCompat = AnimatorCompatHelper.emptyValueAnimator(); animatorCompat.setDuration(mAnimationTime); animatorCompat.addListener(new AnimatorListenerCompat() { @Override/*from w w w.ja v a 2s .c o m*/ public void onAnimationStart(ValueAnimatorCompat animation) { } @Override public void onAnimationEnd(ValueAnimatorCompat animation) { --mDismissAnimationRefCount; if (mDismissAnimationRefCount == 0) { // No active animations, process all pending dismisses. // Sort by descending position Collections.sort(mPendingDismisses); int[] dismissPositions = new int[mPendingDismisses.size()]; for (int i = mPendingDismisses.size() - 1; i >= 0; i--) { dismissPositions[i] = mPendingDismisses.get(i).position; } if (mFinalDelta > 0) { mSwipeListener.onDismissedBySwipeRight(mRecyclerView, dismissPositions); } else { mSwipeListener.onDismissedBySwipeLeft(mRecyclerView, dismissPositions); } // Reset mDownPosition to avoid MotionEvent.ACTION_UP trying to start a dismiss // animation with a stale position mDownPosition = ListView.INVALID_POSITION; ViewGroup.LayoutParams lp; for (PendingDismissData pendingDismiss : mPendingDismisses) { // Reset view presentation ViewCompat.setAlpha(pendingDismiss.view, mAlpha); ViewCompat.setTranslationX(pendingDismiss.view, 0); lp = pendingDismiss.view.getLayoutParams(); lp.height = originalLayoutParamsHeight; pendingDismiss.view.setLayoutParams(lp); } // Send a cancel event long time = SystemClock.uptimeMillis(); MotionEvent cancelEvent = MotionEvent.obtain(time, time, MotionEvent.ACTION_CANCEL, 0, 0, 0); mRecyclerView.dispatchTouchEvent(cancelEvent); mPendingDismisses.clear(); mAnimatingPosition = ListView.INVALID_POSITION; } } @Override public void onAnimationCancel(ValueAnimatorCompat animation) { } @Override public void onAnimationRepeat(ValueAnimatorCompat animation) { } }); animatorCompat.addUpdateListener(new AnimatorUpdateListenerCompat() { @Override public void onAnimationUpdate(ValueAnimatorCompat animation) { float fraction = animation.getAnimatedFraction(); lp.height = (int) (originalHeight * (1 - fraction)); dismissView.setLayoutParams(lp); } }); mPendingDismisses.add(new PendingDismissData(dismissPosition, dismissView)); animatorCompat.start(); }
From source file:org.addhen.smssync.presentation.view.ui.listener.OnSwipeableRecyclerViewTouchListener.java
private void performDismiss(final View dismissView, final int dismissPosition) { // Animate the dismissed list item to zero-height and fire the dismiss callback when // all dismissed list item animations have completed. This triggers layout on each animation // frame; in the future we may want to do something smarter and more performant. final ViewGroup.LayoutParams lp = dismissView.getLayoutParams(); final int originalLayoutParamsHeight = lp.height; final int originalHeight = dismissView.getHeight(); ValueAnimatorCompat animatorCompat = AnimatorCompatHelper.emptyValueAnimator(); animatorCompat.setDuration(mAnimationTime); animatorCompat.addListener(new AnimatorListenerCompat() { @Override//from w ww . j a v a 2s.c om public void onAnimationStart(ValueAnimatorCompat animation) { } @Override public void onAnimationEnd(ValueAnimatorCompat animation) { --mDismissAnimationRefCount; if (mDismissAnimationRefCount == 0) { // No active animations, process all pending dismisses. // Sort by descending position Collections.sort(mPendingDismisses); int[] dismissPositions = new int[mPendingDismisses.size()]; for (int i = mPendingDismisses.size() - 1; i >= 0; i--) { dismissPositions[i] = mPendingDismisses.get(i).position; } if (mFinalDelta > 0) { mSwipeListener.onDismissedBySwipeRight(mRecyclerView, dismissPositions); } else { mSwipeListener.onDismissedBySwipeLeft(mRecyclerView, dismissPositions); } // Reset mDownPosition to avoid MotionEvent.ACTION_UP trying to start a dismiss // animation with a stale position mDownPosition = ListView.INVALID_POSITION; ViewGroup.LayoutParams lp; for (PendingDismissData pendingDismiss : mPendingDismisses) { // Reset view presentation ViewCompat.setAlpha(pendingDismiss.view, mAlpha); ViewCompat.setTranslationX(pendingDismiss.view, 0); lp = pendingDismiss.view.getLayoutParams(); lp.height = originalLayoutParamsHeight; pendingDismiss.view.setLayoutParams(lp); } // Send a cancel event long time = SystemClock.uptimeMillis(); MotionEvent cancelEvent = MotionEvent.obtain(time, time, MotionEvent.ACTION_CANCEL, 0, 0, 0); mRecyclerView.dispatchTouchEvent(cancelEvent); mPendingDismisses.clear(); mAnimatingPosition = ListView.INVALID_POSITION; } } @Override public void onAnimationCancel(ValueAnimatorCompat animation) { } @Override public void onAnimationRepeat(ValueAnimatorCompat animation) { } }); animatorCompat.addUpdateListener(animation -> { float fraction = animation.getAnimatedFraction(); lp.height = (int) (originalHeight * (1 - fraction)); dismissView.setLayoutParams(lp); }); mPendingDismisses.add(new PendingDismissData(dismissPosition, dismissView)); animatorCompat.start(); }
From source file:com.goka.flickableview.ImageViewTouchBase.java
protected void scrollBy(final float distanceX, final float distanceY, final long durationMs) { ValueAnimatorCompat animatorCompat = AnimatorCompatHelper.emptyValueAnimator(); animatorCompat.setDuration(durationMs); stopAllAnimations();//from w w w . j a va 2 s . c om mCurrentAnimation = animatorCompat; mCurrentAnimation.start(); final Interpolator interpolator = new DecelerateInterpolator(); animatorCompat.addUpdateListener(new AnimatorUpdateListenerCompat() { float oldValueX = 0; float oldValueY = 0; @Override public void onAnimationUpdate(ValueAnimatorCompat animation) { float fraction = interpolator.getInterpolation(animation.getAnimatedFraction()); float valueX = fraction * distanceX; float valueY = fraction * distanceY; panBy(valueX - oldValueX, valueY - oldValueY); oldValueX = valueX; oldValueY = valueY; } }); mCurrentAnimation.addListener(new AnimatorListenerCompat() { @Override public void onAnimationStart(ValueAnimatorCompat animation) { } @Override public void onAnimationEnd(ValueAnimatorCompat animation) { RectF centerRect = getCenter(mSuppMatrix, true, true); if (centerRect.left != 0 || centerRect.top != 0) { scrollBy(centerRect.left, centerRect.top); } } @Override public void onAnimationCancel(ValueAnimatorCompat animation) { } @Override public void onAnimationRepeat(ValueAnimatorCompat animation) { } }); }
From source file:com.goka.flickableview.ImageViewTouchBase.java
protected void zoomTo(float scale, float centerX, float centerY, final long durationMs) { if (scale > getMaxScale()) { scale = getMaxScale();//w w w . j av a2s . c o m } final float oldScale = getScale(); Matrix m = new Matrix(mSuppMatrix); m.postScale(scale, scale, centerX, centerY); RectF rect = getCenter(m, true, true); final float finalScale = scale; final float destX = centerX + rect.left * scale; final float destY = centerY + rect.top * scale; stopAllAnimations(); ValueAnimatorCompat animatorCompat = AnimatorCompatHelper.emptyValueAnimator(); animatorCompat.setDuration(durationMs); final Interpolator interpolator = new DecelerateInterpolator(1.0f); animatorCompat.addUpdateListener(new AnimatorUpdateListenerCompat() { @Override public void onAnimationUpdate(ValueAnimatorCompat animation) { float fraction = interpolator.getInterpolation(animation.getAnimatedFraction()); float value = oldScale + (fraction * (finalScale - oldScale)); zoomTo(value, destX, destY); } }); animatorCompat.start(); }