@Override
 public void animate(View view) {
   f = pickScale();
   f2 = pickScale();
   f3 = pickTranslation(view.getWidth(), f);
   f4 = pickTranslation(view.getHeight(), f);
   f5 = pickTranslation(view.getWidth(), f2);
   f6 = pickTranslation(view.getHeight(), f2);
   start(view, Image_Animation_Duration, f, f2, f3, f4, f5, f6);
 }
  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 originalHeight = dismissView.getHeight();

    ((ViewGroup) dismissView)
        .getChildAt(1)
        .animate()
        .translationX(0)
        .alpha(1f)
        .setListener(
            new AnimatorListenerAdapter() {

              @Override
              public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                ((ViewGroup) dismissView).removeViewAt(0);
                Log.d(
                    "Selected view",
                    dismissView.getClass()
                        + "..."
                        + dismissView.getId()
                        + mDismissAnimationRefCount);
                ValueAnimator animator =
                    ValueAnimator.ofInt(originalHeight, 0).setDuration(mAnimationTime);
                animator.addListener(
                    new AnimatorListenerAdapter() {
                      @Override
                      public void onAnimationEnd(Animator 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;
                            Log.d("Dismiss positions....", dismissPositions[i] + "");
                          }
                          tcallbacks.onDismiss(mListView, dismissPositions);
                          //                            ViewGroup.LayoutParams lp;
                          //                          for (PendingDismissData pendingDismiss :
                          // mPendingDismisses) {
                          //                              // Reset view presentation
                          //                              lp =
                          // pendingDismiss.view.getLayoutParams();
                          //                              lp.height = originalHeight;
                          //                              pendingDismiss.view.setLayoutParams(lp);
                          //                          }
                          mPendingDismisses.clear();
                        }
                      }
                    });

                animator.addUpdateListener(
                    new ValueAnimator.AnimatorUpdateListener() {
                      @Override
                      public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        lp.height = (Integer) valueAnimator.getAnimatedValue();
                        dismissView.setLayoutParams(lp);
                      }
                    });

                mPendingDismisses.add(new PendingDismissData(dismissPosition, dismissView));
                animator.start();
              }
            });
  }