From f4b08913677e18a8412930972237b91d5a946d95 Mon Sep 17 00:00:00 2001 From: Adam Cohen Date: Tue, 17 May 2011 18:45:47 -0700 Subject: Pushed folder inner ring drawing into workspace during animation Change-Id: I571b71acbfdd28f921e35e989efd2dceefb54f11 --- src/com/android/launcher2/FolderIcon.java | 119 +++++++++++------------------- src/com/android/launcher2/Workspace.java | 23 ++++-- 2 files changed, 61 insertions(+), 81 deletions(-) (limited to 'src') diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java index 31c5ea069..f49297eb1 100644 --- a/src/com/android/launcher2/FolderIcon.java +++ b/src/com/android/launcher2/FolderIcon.java @@ -18,13 +18,12 @@ package com.android.launcher2; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; -import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.content.Context; import android.content.res.Resources; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -45,22 +44,24 @@ public class FolderIcon extends FrameLayout implements DropTarget, FolderListene private static final int NUM_ITEMS_IN_PREVIEW = 4; private static final float ICON_ANGLE = 15f; - private static final int CONSUMPTION_ANIMATION_DURATION = 60; + private static final int CONSUMPTION_ANIMATION_DURATION = 100; private static final float INNER_RING_GROWTH_FACTOR = 0.1f; private static final float OUTER_RING_BASELINE_SCALE = 0.7f; private static final float OUTER_RING_GROWTH_FACTOR = 0.3f; + private static final float INNER_RING_BASELINE_SCALE = 1.0f; public static Drawable sFolderOuterRingDrawable = null; + public static Drawable sFolderInnerRingDrawable = null; private int mOriginalWidth = -1; private int mOriginalHeight = -1; private int mOriginalX = -1; private int mOriginalY = -1; - private boolean mIsAnimating = false; private int mFolderLocX; private int mFolderLocY; private float mOuterRingScale; + private float mInnerRingScale; public FolderIcon(Context context, AttributeSet attrs) { super(context, attrs); @@ -103,6 +104,10 @@ public class FolderIcon extends FrameLayout implements DropTarget, FolderListene launcher.getResources().getDrawable(R.drawable.portal_ring_outer_holo); } + if (sFolderInnerRingDrawable == null) { + sFolderInnerRingDrawable = + launcher.getResources().getDrawable(R.drawable.portal_ring_inner_holo); + } return icon; } @@ -148,81 +153,52 @@ public class FolderIcon extends FrameLayout implements DropTarget, FolderListene private void animateToAcceptState() { CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams(); - lp.isLockedToGrid = false; - saveState(lp); - - int newWidth = (int) ((1 + INNER_RING_GROWTH_FACTOR) * lp.width); - int newHeight = (int) ((1 + INNER_RING_GROWTH_FACTOR) * lp.width); - int newX = lp.x - (int) ((INNER_RING_GROWTH_FACTOR / 2) * lp.width); - int newY = lp.y - (int) ((INNER_RING_GROWTH_FACTOR / 2) * lp.height); - PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", newWidth); - PropertyValuesHolder height = PropertyValuesHolder.ofInt("height",newHeight); - PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", newX); - PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", newY); - ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(lp, width, height, x, y); - oa.setDuration(CONSUMPTION_ANIMATION_DURATION); - oa.addUpdateListener(new AnimatorUpdateListener() { - public void onAnimationUpdate(ValueAnimator animation) { - requestLayout(); - invalidate(); - } - }); - oa.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - mIsAnimating = true; - } - }); - ValueAnimator outerRingScale = ValueAnimator.ofFloat(0f, 1f); - outerRingScale.setDuration(CONSUMPTION_ANIMATION_DURATION); - outerRingScale.addUpdateListener(new AnimatorUpdateListener() { + ValueAnimator va = ValueAnimator.ofFloat(0f, 1f); + va.setDuration(CONSUMPTION_ANIMATION_DURATION); + va.addUpdateListener(new AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { final float percent = (Float) animation.getAnimatedValue(); mOuterRingScale = OUTER_RING_BASELINE_SCALE + percent * OUTER_RING_GROWTH_FACTOR; + mInnerRingScale = INNER_RING_BASELINE_SCALE + percent * INNER_RING_GROWTH_FACTOR; mLauncher.getWorkspace().invalidate(); - } - }); - - outerRingScale.start(); - oa.start(); - } - - private void animateToNaturalState() { - final CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams(); - lp.isLockedToGrid = false; - - PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", mOriginalWidth); - PropertyValuesHolder height = PropertyValuesHolder.ofInt("height", mOriginalHeight); - PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", mOriginalX); - PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", mOriginalY); - ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(lp, width, height, x, y); - oa.addUpdateListener(new AnimatorUpdateListener() { - public void onAnimationUpdate(ValueAnimator animation) { - requestLayout(); invalidate(); } }); - oa.addListener(new AnimatorListenerAdapter() { + va.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - lp.isLockedToGrid = true; - mIsAnimating = false; + // Instead of setting the background drawable to null, we set the color to + // transparent. Setting the background drawable to null results in onDraw + // not getting called. + setBackgroundColor(Color.TRANSPARENT); + requestLayout(); } }); + va.start(); + } - ValueAnimator outerRingScale = ValueAnimator.ofFloat(0f, 1f); - outerRingScale.setDuration(CONSUMPTION_ANIMATION_DURATION); - outerRingScale.addUpdateListener(new AnimatorUpdateListener() { + private void animateToNaturalState() { + ValueAnimator va = ValueAnimator.ofFloat(0f, 1f); + va.setDuration(CONSUMPTION_ANIMATION_DURATION); + va.addUpdateListener(new AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { final float percent = (Float) animation.getAnimatedValue(); mOuterRingScale = OUTER_RING_BASELINE_SCALE + OUTER_RING_GROWTH_FACTOR - percent * OUTER_RING_GROWTH_FACTOR; + mInnerRingScale = INNER_RING_BASELINE_SCALE + INNER_RING_GROWTH_FACTOR + - percent * INNER_RING_GROWTH_FACTOR; mLauncher.getWorkspace().invalidate(); + invalidate(); } }); - - oa.setDuration(CONSUMPTION_ANIMATION_DURATION); - oa.start(); + va.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + setBackgroundDrawable(sFolderInnerRingDrawable); + mLauncher.getWorkspace().hideFolderAccept(FolderIcon.this); + } + }); + va.start(); } private void determineFolderLocationInWorkspace() { @@ -249,7 +225,6 @@ public class FolderIcon extends FrameLayout implements DropTarget, FolderListene public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { if (!willAcceptItem((ItemInfo) dragInfo)) return; - mLauncher.getWorkspace().hideFolderAccept(this); animateToNaturalState(); } @@ -268,6 +243,10 @@ public class FolderIcon extends FrameLayout implements DropTarget, FolderListene return mOuterRingScale; } + public float getInnerRingScale() { + return mInnerRingScale; + } + @Override protected void onDraw(Canvas canvas) { if (mFolder == null) return; @@ -277,7 +256,6 @@ public class FolderIcon extends FrameLayout implements DropTarget, FolderListene TextView v = (TextView) mFolder.getItemAt(0); Drawable d = v.getCompoundDrawables()[1]; - CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams(); if (mOriginalWidth < 0 || mOriginalHeight < 0) { mOriginalWidth = getMeasuredWidth(); mOriginalHeight = getMeasuredHeight(); @@ -285,30 +263,21 @@ public class FolderIcon extends FrameLayout implements DropTarget, FolderListene int xShift = (mOriginalWidth - d.getIntrinsicWidth()) / 2; int yShift = (mOriginalHeight - d.getIntrinsicHeight()) / 2; - - if (mIsAnimating) { - xShift -= lp.x - mOriginalX; - yShift -= lp.y - mOriginalY; - } - canvas.translate(xShift, yShift); - canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2); - canvas.rotate(ICON_ANGLE); - canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2); for (int i = Math.max(0, mFolder.getItemCount() - NUM_ITEMS_IN_PREVIEW); i < mFolder.getItemCount(); i++) { v = (TextView) mFolder.getItemAt(i); d = v.getCompoundDrawables()[1]; + canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2); + canvas.rotate(i == 0 ? ICON_ANGLE : -ICON_ANGLE); + canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2); + if (d != null) { d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); d.draw(canvas); } - - canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2); - canvas.rotate(-ICON_ANGLE); - canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2); } canvas.restore(); diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index fed991c39..bc15b32a7 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -1234,15 +1234,26 @@ public class Workspace extends SmoothPagedView } } - // The folder outer ring image(s) + // The folder outer / inner ring image(s) for (int i = 0; i < mFolderOuterRings.size(); i++) { + + // Draw outer ring FolderIcon fi = mFolderOuterRings.get(i); - final Drawable d = FolderIcon.sFolderOuterRingDrawable; - final int width = (int) (d.getIntrinsicWidth() * fi.getOuterRingScale()); - final int height = (int) (d.getIntrinsicHeight() * fi.getOuterRingScale()); + Drawable d = FolderIcon.sFolderOuterRingDrawable; + int width = (int) (d.getIntrinsicWidth() * fi.getOuterRingScale()); + int height = (int) (d.getIntrinsicHeight() * fi.getOuterRingScale()); fi.getFolderLocation(mTempLocation); - final int x = mTempLocation[0] + mScrollX - width / 2; - final int y = mTempLocation[1] + mScrollY - height / 2; + int x = mTempLocation[0] + mScrollX - width / 2; + int y = mTempLocation[1] + mScrollY - height / 2; + d.setBounds(x, y, x + width, y + height); + d.draw(canvas); + + // Draw inner ring + d = FolderIcon.sFolderInnerRingDrawable; + width = (int) (fi.getMeasuredWidth() * fi.getInnerRingScale()); + height = (int) (fi.getMeasuredHeight() * fi.getInnerRingScale()); + x = mTempLocation[0] + mScrollX - width / 2; + y = mTempLocation[1] + mScrollY - height / 2; d.setBounds(x, y, x + width, y + height); d.draw(canvas); } -- cgit v1.2.3