private void hideCard(int which) { if (isAnimating) return; List<Animator> animators = new ArrayList<>(mChildCount); final View displayingCard = getChildAt(which); int t = (int) (getMeasuredHeight() - (mChildCount - which) * mTitleBarHeightNoDisplay); ValueAnimator displayAnimator = ValueAnimator.ofFloat(ViewHelper.getY(displayingCard), t).setDuration(mDuration); displayAnimator.setTarget(displayingCard); final int finalT = t; displayAnimator.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { float value = (float) valueAnimator.getAnimatedValue(); ViewHelper.setY(displayingCard, value); if (mDarkFrameLayout != null && isFade && value < finalT) { mDarkFrameLayout.fade((int) ((1 - value / finalT) * DarkFrameLayout.MAX_ALPHA)); } } }); animators.add(displayAnimator); for (int i = 0; i < mChildCount; i++) { if (i == 0 && isExistBackground) continue; if (i != which) { t = (int) (getMeasuredHeight() - (mChildCount - i) * mTitleBarHeightNoDisplay); animators.add( ObjectAnimator.ofFloat(getChildAt(i), "y", ViewHelper.getY(getChildAt(i)), t)); } } AnimatorSet set = new AnimatorSet(); set.addListener( new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { isAnimating = true; } @Override public void onAnimationEnd(Animator animator) { isAnimating = false; isDisplaying = false; } @Override public void onAnimationCancel(Animator animator) { isAnimating = false; isDisplaying = false; } @Override public void onAnimationRepeat(Animator animator) {} }); set.setInterpolator(mCloseAnimatorInterpolator); set.playTogether(animators); set.start(); mDisplayingCard = -1; if (mOnDisplayOrHideListener != null) mOnDisplayOrHideListener.onHide(isExistBackground ? (which - 1) : which); }
private boolean handleActionDown(MotionEvent event) { boolean isConsume = false; mPressStartTime = System.currentTimeMillis(); firstDownY = downY = event.getY(); firstDownX = event.getX(); int childCount = isExistBackground ? (mChildCount - 1) : mChildCount; // Judge which card on touching if (!isDisplaying && downY > (getMeasuredHeight() - mChildCount * mTitleBarHeightNoDisplay)) { for (int i = 1; i <= mChildCount; i++) { if (downY < (getMeasuredHeight() - mChildCount * mTitleBarHeightNoDisplay + mTitleBarHeightNoDisplay * i)) { whichCardOnTouch = i - 1; isTouchOnCard = true; if (mOnDisplayOrHideListener != null) mOnDisplayOrHideListener.onTouchCard(whichCardOnTouch); isConsume = true; break; } } mTouchingViewOriginY = ViewHelper.getY(getChildAt(whichCardOnTouch)); } else if (isDisplaying && downY > (getMeasuredHeight() - (childCount - 1) * mTitleBarHeightDisplay)) { hideCard(mDisplayingCard); } else if (isDisplaying && downY > mMarginTop && mDisplayingCard >= 0 && downY < getChildAt(mDisplayingCard).getMeasuredHeight() + mMarginTop) { whichCardOnTouch = mDisplayingCard; isTouchOnCard = true; } else if (isDisplaying && (downY < mMarginTop || (mDisplayingCard >= 0 && (downY > mMarginTop + getChildAt(mDisplayingCard).getMeasuredHeight())))) { hideCard(mDisplayingCard); } if (isExistBackground && whichCardOnTouch == 0) { isTouchOnCard = false; } return isConsume; }
private void displayCard(int which) { if (isDisplaying || isAnimating) return; if (isFade && mDarkFrameLayout != null) mDarkFrameLayout.fade(true); List<Animator> animators = new ArrayList<>(mChildCount); final float distance = ViewHelper.getY(getChildAt(which)) - mMarginTop; ValueAnimator displayAnimator = ValueAnimator.ofFloat(ViewHelper.getY(getChildAt(which)), mMarginTop) .setDuration(mDuration); displayAnimator.setTarget(getChildAt(which)); final View displayingView = getChildAt(which); displayAnimator.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { float value = (float) valueAnimator.getAnimatedValue(); ViewHelper.setY(displayingView, value); if (mDarkFrameLayout != null && isFade) { mDarkFrameLayout.fade( (int) ((1 - (value - mMarginTop) / distance) * DarkFrameLayout.MAX_ALPHA)); } } }); animators.add(displayAnimator); int n = isExistBackground ? (mChildCount - 1) : mChildCount; for (int i = 0, j = 1; i < mChildCount; i++) { if (i == 0 && isExistBackground) continue; if (i != which) { animators.add( ObjectAnimator.ofFloat( getChildAt(i), "y", ViewHelper.getY(getChildAt(i)), getMeasuredHeight() - mTitleBarHeightDisplay * (n - j)) .setDuration(mDuration)); j++; } } AnimatorSet set = new AnimatorSet(); set.addListener( new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { isAnimating = true; } @Override public void onAnimationEnd(Animator animator) { isAnimating = false; } @Override public void onAnimationCancel(Animator animator) { isAnimating = false; } @Override public void onAnimationRepeat(Animator animator) {} }); set.setInterpolator(mOpenAnimatorInterpolator); set.playTogether(animators); set.start(); isDisplaying = true; mDisplayingCard = which; if (mOnDisplayOrHideListener != null) mOnDisplayOrHideListener.onDisplay(isExistBackground ? (which - 1) : which); }