void showFlipAnimation() {
    if (!inFlipAnimation) {
      inFlipAnimation = true;

      cards.setVisible(true);
      cards.setFirstDrawFinished(false);
      surfaceView.requestRender();
    }
  }
  @Override
  public void setSelection(int position) {
    if (adapter == null) {
      return;
    }

    Assert.assertTrue("Invalid selection position", position >= 0 && position < adapterDataCount);

    releaseViews();

    View selectedView = viewFromAdapter(position, true);
    bufferedViews.add(selectedView);

    for (int i = 1; i <= sideBufferSize; i++) {
      int previous = position - i;
      int next = position + i;

      if (previous >= 0) {
        bufferedViews.addFirst(viewFromAdapter(previous, false));
      }
      if (next < adapterDataCount) {
        bufferedViews.addLast(viewFromAdapter(next, true));
      }
    }

    bufferIndex = bufferedViews.indexOf(selectedView);
    adapterIndex = position;

    requestLayout();
    updateVisibleView(inFlipAnimation ? -1 : bufferIndex);

    cards.resetSelection(position, adapterDataCount);
  }
 // --------------------------------------------------------------------------------------------------------------------
 // Touch Event
 @Override
 public boolean onInterceptTouchEvent(MotionEvent event) {
   if (flipByTouchEnabled) {
     return cards.handleTouchEvent(event, false);
   } else {
     return false;
   }
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
   if (playPauseCallBack != null && (event.getAction() == MotionEvent.ACTION_DOWN)) {
     playPauseCallBack.pauseOrPlay(bufferedViews.get(bufferIndex), event);
   }
   if (flipByTouchEnabled) {
     return cards.handleTouchEvent(event, true);
   } else {
     return false;
   }
 }
 // add by hz
 public void autoFlip() {
   if (adapterIndex + 1 < adapterDataCount) {
     cards.nextPage();
   }
 }
 /** Force the animator reload all preloaded pages */
 public void refreshAllPages() {
   cards.refreshAllPages();
   requestLayout();
 }
 /** @see #refreshPage(android.view.View) */
 public void refreshPage(int pageIndex) {
   if (cards.refreshPage(pageIndex)) {
     requestLayout();
   }
 }
 /**
  * Request the animator to update display if the pageView has been preloaded.
  *
  * <p>If the pageView is being used in the animation or its content has been buffered, the
  * animator forcibly reloads it.
  *
  * <p>The reloading process is a bit heavy for an active page, so please don't invoke it too
  * frequently for an active page. The cost is trivial for inactive pages.
  */
 public void refreshPage(View pageView) {
   if (cards.refreshPageView(pageView)) {
     requestLayout();
   }
 }