/** 点击按钮消失动画 */
  private void vanishOnBtnClick(int type) {
    synchronized (obj1) {
      View animateView = viewList.get(0);
      if (animateView.getVisibility() != View.VISIBLE || releasedViewList.contains(animateView)) {
        return;
      }

      int finalX = 0;
      if (type == VANISH_TYPE_LEFT) {
        finalX = -childWith;
      } else if (type == VANISH_TYPE_RIGHT) {
        finalX = allWidth;
      }

      if (finalX != 0) {
        releasedViewList.add(animateView);
        if (mDragHelper.smoothSlideViewTo(animateView, finalX, initCenterViewY + allHeight)) {
          ViewCompat.postInvalidateOnAnimation(this);
        }
      }

      if (type >= 0 && cardSwitchListener != null) {
        cardSwitchListener.onCardVanish(isShowing, type);
      }
    }
  }
  /**
   * 松手时处理滑动到边缘的动画
   *
   * @param xvel X方向上的滑动速度
   */
  private void animToSide(View changedView, float xvel, float yvel) {
    int finalX = initCenterViewX;
    int finalY = initCenterViewY;
    int flyType = -1;

    // 1. 下面这一坨计算finalX和finalY,要读懂代码需要建立一个比较清晰的数学模型才能理解,不信拉倒
    int dx = changedView.getLeft() - initCenterViewX;
    int dy = changedView.getTop() - initCenterViewY;
    if (dx == 0) {
      // 由于dx作为分母,此处保护处理
      dx = 1;
    }
    if (xvel > X_VEL_THRESHOLD || dx > X_DISTANCE_THRESHOLD) {
      finalX = allWidth;
      finalY = dy * (childWith + initCenterViewX) / dx + initCenterViewY;
      flyType = VANISH_TYPE_RIGHT;
    } else if (xvel < -X_VEL_THRESHOLD || dx < -X_DISTANCE_THRESHOLD) {
      finalX = -childWith;
      finalY = dy * (childWith + initCenterViewX) / (-dx) + dy + initCenterViewY;
      flyType = VANISH_TYPE_LEFT;
    }

    // 如果斜率太高,就折中处理
    if (finalY > allHeight) {
      finalY = allHeight;
    } else if (finalY < -allHeight / 2) {
      finalY = -allHeight / 2;
    }

    // 如果没有飞向两侧,而是回到了中间,需要谨慎处理
    if (finalX != initCenterViewX) {
      releasedViewList.add(changedView);
    }

    // 2. 启动动画
    if (mDragHelper.smoothSlideViewTo(changedView, finalX, finalY)) {
      ViewCompat.postInvalidateOnAnimation(this);
    }

    // 3. 消失动画即将进行,listener回调
    if (flyType >= 0 && cardSwitchListener != null) {
      cardSwitchListener.onCardVanish(isShowing, flyType);
    }
  }