@Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (mFolder == null) return; if (mFolder.getItemCount() == 0 && !mAnimating) return; ArrayList<View> items = mFolder.getItemsInReadingOrder(false); Drawable d; TextView v; // Update our drawing parameters if necessary if (mAnimating) { computePreviewDrawingParams(mAnimParams.drawable); } else { v = (TextView) items.get(0); d = v.getCompoundDrawables()[1]; computePreviewDrawingParams(d); } int nItemsInPreview = Math.min(items.size(), NUM_ITEMS_IN_PREVIEW); if (!mAnimating) { for (int i = nItemsInPreview - 1; i >= 0; i--) { v = (TextView) items.get(i); d = v.getCompoundDrawables()[1]; mParams = computePreviewItemDrawingParams(i, mParams); mParams.drawable = d; drawPreviewItem(canvas, mParams); } } else { drawPreviewItem(canvas, mAnimParams); } }
private void animateFirstItem(final Drawable d, int duration) { computePreviewDrawingParams(d); final PreviewItemDrawingParams finalParams = computePreviewItemDrawingParams(0, null); final float scale0 = 1.0f; final float transX0 = (mAvailableSpaceInPreview - d.getIntrinsicWidth()) / 2; final float transY0 = (mAvailableSpaceInPreview - d.getIntrinsicHeight()) / 2; mAnimParams.drawable = d; ValueAnimator va = ValueAnimator.ofFloat(0f, 1.0f); va.addUpdateListener( new AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { float progress = (Float) animation.getAnimatedValue(); mAnimParams.transX = transX0 + progress * (finalParams.transX - transX0); mAnimParams.transY = transY0 + progress * (finalParams.transY - transY0); mAnimParams.scale = scale0 + progress * (finalParams.scale - scale0); invalidate(); } }); va.addListener( new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { mAnimating = true; } @Override public void onAnimationEnd(Animator animation) { mAnimating = false; } }); va.setDuration(duration); va.start(); }