summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher2
diff options
context:
space:
mode:
authorAdam Cohen <adamcohen@google.com>2012-06-06 17:47:33 -0700
committerAdam Cohen <adamcohen@google.com>2012-06-07 11:53:34 -0700
commit268c4751b547e1470a94030af73a4e7bb8ea221e (patch)
treee9c87c8e79a5394f031952610ae7ea1ae8753d2a /src/com/android/launcher2
parent478244409e15594ceaa7426a6a23cc805db0b1fc (diff)
downloadandroid_packages_apps_Trebuchet-268c4751b547e1470a94030af73a4e7bb8ea221e.tar.gz
android_packages_apps_Trebuchet-268c4751b547e1470a94030af73a4e7bb8ea221e.tar.bz2
android_packages_apps_Trebuchet-268c4751b547e1470a94030af73a4e7bb8ea221e.zip
Fix two pieces of folder jank
-> Folder icon gets clipped when animating from dock as well as a couple other cases (issue 5849615) -> Blip when creating folder (issue 6623095) Change-Id: I638c9a7876de2f87eb8e96a9eb192fa4a127fb4a
Diffstat (limited to 'src/com/android/launcher2')
-rw-r--r--src/com/android/launcher2/Folder.java16
-rw-r--r--src/com/android/launcher2/FolderIcon.java7
-rw-r--r--src/com/android/launcher2/Launcher.java85
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 659077f71..512b49c60 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;
@@ -2028,8 +2035,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);
@@ -2041,31 +2093,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);
}
}
});
@@ -2083,7 +2144,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.
@@ -2096,6 +2156,7 @@ public final class Launcher extends Activity
folder.getParent() + ").");
}
folder.animateOpen();
+ growAndFadeOutFolderIcon(folderIcon);
}
public void closeFolder() {