diff options
author | Adam Cohen <adamcohen@google.com> | 2012-06-08 11:52:42 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-06-08 11:52:42 -0700 |
commit | 001a17fcf5b825801bc9987cebab9411ce329f9d (patch) | |
tree | d6f8225807e7215dd5ab17fe23253574ddd96712 | |
parent | e44a47881e2849fa2d4e0f45e5cf6aa1595c0e8d (diff) | |
parent | ec3f3b92f0d3e545f1921b6111a34541000f416c (diff) | |
download | android_packages_apps_Trebuchet-001a17fcf5b825801bc9987cebab9411ce329f9d.tar.gz android_packages_apps_Trebuchet-001a17fcf5b825801bc9987cebab9411ce329f9d.tar.bz2 android_packages_apps_Trebuchet-001a17fcf5b825801bc9987cebab9411ce329f9d.zip |
am ec3f3b92: Merge "Fix two pieces of folder jank" into jb-dev
* commit 'ec3f3b92f0d3e545f1921b6111a34541000f416c':
Fix two pieces of folder jank
-rw-r--r-- | src/com/android/launcher2/Folder.java | 16 | ||||
-rw-r--r-- | src/com/android/launcher2/FolderIcon.java | 7 | ||||
-rw-r--r-- | src/com/android/launcher2/Launcher.java | 85 |
3 files changed, 85 insertions, 23 deletions
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java index db65a31ee..1163f9ec4 100644 --- a/src/com/android/launcher2/Folder.java +++ b/src/com/android/launcher2/Folder.java @@ -100,6 +100,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList private boolean mSuppressFolderDeletion = false; private boolean mItemAddedBackToSelfViaIcon = false; FolderEditText mFolderName; + private float mFolderIconPivotX; + private float mFolderIconPivotY; private boolean mIsEditingName = false; private InputMethodManager mInputMethodManager; @@ -839,20 +841,24 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList int folderPivotY = height / 2 + (centeredTop - top); setPivotX(folderPivotX); setPivotY(folderPivotY); - int folderIconPivotX = (int) (mFolderIcon.getMeasuredWidth() * + mFolderIconPivotX = (int) (mFolderIcon.getMeasuredWidth() * (1.0f * folderPivotX / width)); - int folderIconPivotY = (int) (mFolderIcon.getMeasuredHeight() * + mFolderIconPivotY = (int) (mFolderIcon.getMeasuredHeight() * (1.0f * folderPivotY / height)); - mFolderIcon.setPivotX(folderIconPivotX); - mFolderIcon.setPivotY(folderIconPivotY); - lp.width = width; lp.height = height; lp.x = left; lp.y = top; } + float getPivotXForIconAnimation() { + return mFolderIconPivotX; + } + float getPivotYForIconAnimation() { + return mFolderIconPivotY; + } + private void setupContentForNumItems(int count) { setupContentDimensions(count); diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java index d64308406..4919b57f0 100644 --- a/src/com/android/launcher2/FolderIcon.java +++ b/src/com/android/launcher2/FolderIcon.java @@ -321,12 +321,7 @@ public class FolderIcon extends LinearLayout implements FolderListener { // This will animate the first item from it's position as an icon into its // position as the first item in the preview animateFirstItem(animateDrawable, INITIAL_ITEM_ANIMATION_DURATION); - - postDelayed(new Runnable() { - public void run() { - addItem(destInfo); - } - }, INITIAL_ITEM_ANIMATION_DURATION); + addItem(destInfo); } public void onDragExit(Object dragInfo) { diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index e156c9895..7da5b56c8 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -48,6 +48,9 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.content.res.Resources; import android.database.ContentObserver; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -278,6 +281,10 @@ public final class Launcher extends Activity // when we scroll to that page on resume. private int mNewShortcutAnimatePage = -1; private ArrayList<View> mNewShortcutAnimateViews = new ArrayList<View>(); + private ImageView mFolderIconImageView; + private Bitmap mFolderIconBitmap; + private Canvas mFolderIconCanvas; + private Rect mRectForFolderAnimation = new Rect(); private BubbleTextView mWaitingForResume; @@ -2026,8 +2033,53 @@ public final class Launcher extends Activity } } + /** + * This method draws the FolderIcon to an ImageView and then adds and positions that ImageView + * in the DragLayer in the exact absolute location of the original FolderIcon. + */ + private void copyFolderIconToImage(FolderIcon fi) { + final int width = fi.getMeasuredWidth(); + final int height = fi.getMeasuredHeight(); + + // Lazy load ImageView, Bitmap and Canvas + if (mFolderIconImageView == null) { + mFolderIconImageView = new ImageView(this); + } + if (mFolderIconBitmap == null || mFolderIconBitmap.getWidth() != width || + mFolderIconBitmap.getHeight() != height) { + mFolderIconBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + mFolderIconCanvas = new Canvas(mFolderIconBitmap); + } + + DragLayer.LayoutParams lp; + if (mFolderIconImageView.getLayoutParams() instanceof DragLayer.LayoutParams) { + lp = (DragLayer.LayoutParams) mFolderIconImageView.getLayoutParams(); + } else { + lp = new DragLayer.LayoutParams(width, height); + } + + mDragLayer.getViewRectRelativeToSelf(fi, mRectForFolderAnimation); + lp.customPosition = true; + lp.x = mRectForFolderAnimation.left; + lp.y = mRectForFolderAnimation.top; + + mFolderIconCanvas.drawColor(0, PorterDuff.Mode.CLEAR); + fi.draw(mFolderIconCanvas); + mFolderIconImageView.setImageBitmap(mFolderIconBitmap); + mFolderIconImageView.setPivotX(fi.mFolder.getPivotXForIconAnimation()); + mFolderIconImageView.setPivotY(fi.mFolder.getPivotYForIconAnimation()); + + // Just in case this image view is still in the drag layer from a previous animation, + // we remove it and re-add it. + if (mDragLayer.indexOfChild(mFolderIconImageView) != -1) { + mDragLayer.removeView(mFolderIconImageView); + } + mDragLayer.addView(mFolderIconImageView, lp); + } + private void growAndFadeOutFolderIcon(FolderIcon fi) { if (fi == null) return; + PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0); PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.5f); PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.5f); @@ -2039,31 +2091,40 @@ public final class Launcher extends Activity cl.setFolderLeaveBehindCell(lp.cellX, lp.cellY); } - ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(fi, alpha, scaleX, scaleY); + // Push an ImageView copy of the FolderIcon into the DragLayer and hide the original + copyFolderIconToImage(fi); + fi.setVisibility(View.INVISIBLE); + + ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(mFolderIconImageView, alpha, + scaleX, scaleY); oa.setDuration(getResources().getInteger(R.integer.config_folderAnimDuration)); oa.start(); } - private void shrinkAndFadeInFolderIcon(FolderIcon fi) { + private void shrinkAndFadeInFolderIcon(final FolderIcon fi) { if (fi == null) return; + PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1.0f); PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f); PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f); - FolderInfo info = (FolderInfo) fi.getTag(); - CellLayout cl = null; - if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - cl = (CellLayout) fi.getParent().getParent(); - } + final CellLayout cl = (CellLayout) fi.getParent().getParent(); + + // We remove and re-draw the FolderIcon in-case it has changed + mDragLayer.removeView(mFolderIconImageView); + copyFolderIconToImage(fi); - final CellLayout layout = cl; - ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(fi, alpha, scaleX, scaleY); + ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(mFolderIconImageView, alpha, + scaleX, scaleY); oa.setDuration(getResources().getInteger(R.integer.config_folderAnimDuration)); oa.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - if (layout != null) { - layout.clearFolderLeaveBehind(); + if (cl != null) { + cl.clearFolderLeaveBehind(); + // Remove the ImageView copy of the FolderIcon and make the original visible. + mDragLayer.removeView(mFolderIconImageView); + fi.setVisibility(View.VISIBLE); } } }); @@ -2081,7 +2142,6 @@ public final class Launcher extends Activity Folder folder = folderIcon.mFolder; FolderInfo info = folder.mInfo; - growAndFadeOutFolderIcon(folderIcon); info.opened = true; // Just verify that the folder hasn't already been added to the DragLayer. @@ -2094,6 +2154,7 @@ public final class Launcher extends Activity folder.getParent() + ")."); } folder.animateOpen(); + growAndFadeOutFolderIcon(folderIcon); } public void closeFolder() { |