summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher2/DragController.java
diff options
context:
space:
mode:
authorAdam Cohen <adamcohen@google.com>2011-07-07 16:38:18 -0700
committerAdam Cohen <adamcohen@google.com>2011-07-07 16:59:45 -0700
commit8dfcba4af7a7ece09e8c7d96053e54f3a383e905 (patch)
treeae4f19fca62ced61657c228ce5cc1325ff49d1a3 /src/com/android/launcher2/DragController.java
parenteb99f1648c63ad35e1a528e566aa47df581864f8 (diff)
downloadpackages_apps_trebuchet-8dfcba4af7a7ece09e8c7d96053e54f3a383e905.zip
packages_apps_trebuchet-8dfcba4af7a7ece09e8c7d96053e54f3a383e905.tar.gz
packages_apps_trebuchet-8dfcba4af7a7ece09e8c7d96053e54f3a383e905.tar.bz2
Substantially improved performance of dragging and drop animations
-> Took DragView drawing out of the window and put it into the DragLayer -> Added fade-in/out animations to transition between the final view and the DragView, after the view animates -> Enabled hardware layers on Folder items which improves the performance Folder reordering Change-Id: I4d92ca9fba172d1bab9efc215a99abcaadcdf503
Diffstat (limited to 'src/com/android/launcher2/DragController.java')
-rw-r--r--src/com/android/launcher2/DragController.java120
1 files changed, 45 insertions, 75 deletions
diff --git a/src/com/android/launcher2/DragController.java b/src/com/android/launcher2/DragController.java
index 9a6335b..f6058a0 100644
--- a/src/com/android/launcher2/DragController.java
+++ b/src/com/android/launcher2/DragController.java
@@ -61,7 +61,7 @@ public class DragController {
static final int SCROLL_LEFT = 0;
static final int SCROLL_RIGHT = 1;
- private Context mContext;
+ private Launcher mLauncher;
private Handler mHandler;
private final Vibrator mVibrator = new Vibrator();
@@ -78,9 +78,6 @@ public class DragController {
/** Y coordinate of the down event. */
private int mMotionDownY;
- /** Info about the screen for clamping. */
- private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
-
/** the area at the edge of the screen that makes the workspace go left
* or right while you're dragging.
*/
@@ -139,10 +136,10 @@ public class DragController {
*
* @param context The application's context.
*/
- public DragController(Context context) {
- mContext = context;
+ public DragController(Launcher launcher) {
+ mLauncher = launcher;
mHandler = new Handler();
- mScrollZone = context.getResources().getDimensionPixelSize(R.dimen.scroll_zone);
+ mScrollZone = launcher.getResources().getDimensionPixelSize(R.dimen.scroll_zone);
}
public boolean dragging() {
@@ -183,11 +180,11 @@ public class DragController {
}
int[] loc = mCoordinatesTemp;
- v.getLocationOnScreen(loc);
- int screenX = loc[0];
- int screenY = loc[1];
+ mLauncher.getDragLayer().getLocationInDragLayer(v, loc);
+ int dragLayerX = loc[0];
+ int dragLayerY = loc[1];
- startDrag(b, screenX, screenY, source, dragInfo, dragAction, dragRegion);
+ startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, dragRegion);
b.recycle();
if (dragAction == DRAG_ACTION_MOVE) {
@@ -210,11 +207,11 @@ public class DragController {
public void startDrag(View v, Bitmap bmp, DragSource source, Object dragInfo, int dragAction,
Rect dragRegion) {
int[] loc = mCoordinatesTemp;
- v.getLocationOnScreen(loc);
- int screenX = loc[0];
- int screenY = loc[1];
+ mLauncher.getDragLayer().getLocationInDragLayer(v, loc);
+ int dragLayerX = loc[0];
+ int dragLayerY = loc[1];
- startDrag(bmp, screenX, screenY, source, dragInfo, dragAction, dragRegion);
+ startDrag(bmp, dragLayerX, dragLayerY, source, dragInfo, dragAction, dragRegion);
if (dragAction == DRAG_ACTION_MOVE) {
v.setVisibility(View.GONE);
@@ -226,16 +223,16 @@ public class DragController {
*
* @param b The bitmap to display as the drag image. It will be re-scaled to the
* enlarged size.
- * @param screenX The x position on screen of the left-top of the bitmap.
- * @param screenY The y position on screen of the left-top of the bitmap.
+ * @param dragLayerX The x position in the DragLayer of the left-top of the bitmap.
+ * @param dragLayerY The y position in the DragLayer of the left-top of the bitmap.
* @param source An object representing where the drag originated
* @param dragInfo The data associated with the object that is being dragged
* @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
* {@link #DRAG_ACTION_COPY}
*/
- public void startDrag(Bitmap b, int screenX, int screenY,
+ public void startDrag(Bitmap b, int dragLayerX, int dragLayerY,
DragSource source, Object dragInfo, int dragAction) {
- startDrag(b, screenX, screenY, source, dragInfo, dragAction, null);
+ startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, null);
}
/**
@@ -243,8 +240,8 @@ public class DragController {
*
* @param b The bitmap to display as the drag image. It will be re-scaled to the
* enlarged size.
- * @param screenX The x position on screen of the left-top of the bitmap.
- * @param screenY The y position on screen of the left-top of the bitmap.
+ * @param dragLayerX The x position in the DragLayer of the left-top of the bitmap.
+ * @param dragLayerY The y position in the DragLayer of the left-top of the bitmap.
* @param source An object representing where the drag originated
* @param dragInfo The data associated with the object that is being dragged
* @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
@@ -252,7 +249,7 @@ public class DragController {
* @param dragRegion Coordinates within the bitmap b for the position of item being dragged.
* Makes dragging feel more precise, e.g. you can clip out a transparent border
*/
- public void startDrag(Bitmap b, int screenX, int screenY,
+ public void startDrag(Bitmap b, int dragLayerX, int dragLayerY,
DragSource source, Object dragInfo, int dragAction, Rect dragRegion) {
if (PROFILE_DRAWING_DURING_DRAG) {
android.os.Debug.startMethodTracing("Launcher");
@@ -261,7 +258,7 @@ public class DragController {
// Hide soft keyboard, if visible
if (mInputMethodManager == null) {
mInputMethodManager = (InputMethodManager)
- mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
+ mLauncher.getSystemService(Context.INPUT_METHOD_SERVICE);
}
mInputMethodManager.hideSoftInputFromWindow(mWindowToken, 0);
@@ -269,8 +266,8 @@ public class DragController {
listener.onDragStart(source, dragInfo, dragAction);
}
- final int registrationX = ((int)mMotionDownX) - screenX;
- final int registrationY = ((int)mMotionDownY) - screenY;
+ final int registrationX = mMotionDownX - dragLayerX;
+ final int registrationY = mMotionDownY - dragLayerY;
final int dragRegionLeft = dragRegion == null ? 0 : dragRegion.left;
final int dragRegionTop = dragRegion == null ? 0 : dragRegion.top;
@@ -278,14 +275,14 @@ public class DragController {
mDragging = true;
mDragObject.dragComplete = false;
- mDragObject.xOffset = mMotionDownX - (screenX + dragRegionLeft);
- mDragObject.yOffset = mMotionDownY - (screenY + dragRegionTop);
+ mDragObject.xOffset = mMotionDownX - (dragLayerX + dragRegionLeft);
+ mDragObject.yOffset = mMotionDownY - (dragLayerY + dragRegionTop);
mDragObject.dragSource = source;
mDragObject.dragInfo = dragInfo;
mVibrator.vibrate(VIBRATE_DURATION);
- final DragView dragView = mDragObject.dragView = new DragView(mContext, b, registrationX,
+ final DragView dragView = mDragObject.dragView = new DragView(mLauncher, b, registrationX,
registrationY, 0, 0, b.getWidth(), b.getHeight());
final DragSource dragSource = source;
@@ -299,9 +296,8 @@ public class DragController {
dragView.setDragRegion(new Rect(dragRegion));
}
- dragView.show(mWindowToken, (int)mMotionDownX, (int)mMotionDownY);
-
- handleMoveEvent((int) mMotionDownX, (int) mMotionDownY);
+ dragView.show(mMotionDownX, mMotionDownY);
+ handleMoveEvent(mMotionDownX, mMotionDownY);
}
/**
@@ -398,25 +394,21 @@ public class DragController {
}
final int action = ev.getAction();
- if (action == MotionEvent.ACTION_DOWN) {
- recordScreenSize();
- }
-
- final int screenX = clamp((int)ev.getRawX(), 0, mDisplayMetrics.widthPixels);
- final int screenY = clamp((int)ev.getRawY(), 0, mDisplayMetrics.heightPixels);
+ final int dragLayerX = (int) ev.getX();
+ final int dragLayerY = (int) ev.getY();
switch (action) {
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_DOWN:
// Remember location of down touch
- mMotionDownX = screenX;
- mMotionDownY = screenY;
+ mMotionDownX = dragLayerX;
+ mMotionDownY = dragLayerY;
mLastDropTarget = null;
break;
case MotionEvent.ACTION_UP:
if (mDragging) {
- drop(screenX, screenY);
+ drop(dragLayerX, dragLayerY);
}
endDrag();
break;
@@ -475,7 +467,7 @@ public class DragController {
// After a scroll, the touch point will still be in the scroll region.
// Rather than scrolling immediately, require a bit of twiddling to scroll again
- final int slop = ViewConfiguration.get(mContext).getScaledWindowTouchSlop();
+ final int slop = ViewConfiguration.get(mLauncher).getScaledWindowTouchSlop();
mDistanceSinceScroll +=
Math.sqrt(Math.pow(mLastTouch[0] - x, 2) + Math.pow(mLastTouch[1] - y, 2));
mLastTouch[0] = x;
@@ -514,16 +506,16 @@ public class DragController {
}
final int action = ev.getAction();
- final int screenX = clamp((int)ev.getRawX(), 0, mDisplayMetrics.widthPixels);
- final int screenY = clamp((int)ev.getRawY(), 0, mDisplayMetrics.heightPixels);
+ final int dragLayerX = (int) ev.getX();
+ final int dragLayerY = (int) ev.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Remember where the motion event started
- mMotionDownX = screenX;
- mMotionDownY = screenY;
+ mMotionDownX = dragLayerX;
+ mMotionDownY = dragLayerY;
- if ((screenX < mScrollZone) || (screenX > mScrollView.getWidth() - mScrollZone)) {
+ if ((dragLayerX < mScrollZone) || (dragLayerX > mScrollView.getWidth() - mScrollZone)) {
mScrollState = SCROLL_WAITING_IN_ZONE;
mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
} else {
@@ -531,15 +523,15 @@ public class DragController {
}
break;
case MotionEvent.ACTION_MOVE:
- handleMoveEvent(screenX, screenY);
+ handleMoveEvent(dragLayerX, dragLayerY);
break;
case MotionEvent.ACTION_UP:
// Ensure that we've processed a move event at the current pointer location.
- handleMoveEvent(screenX, screenY);
+ handleMoveEvent(dragLayerX, dragLayerY);
mHandler.removeCallbacks(mScrollRunnable);
if (mDragging) {
- drop(screenX, screenY);
+ drop(dragLayerX, dragLayerY);
}
endDrag();
break;
@@ -581,8 +573,8 @@ public class DragController {
target.getHitRect(r);
- // Convert the hit rect to screen coordinates
- target.getLocationOnScreen(dropCoordinates);
+ // Convert the hit rect to DragLayer coordinates
+ target.getLocationInDragLayer(dropCoordinates);
r.offset(dropCoordinates[0] - target.getLeft(), dropCoordinates[1] - target.getTop());
mDragObject.x = x;
@@ -591,7 +583,7 @@ public class DragController {
DropTarget delegate = target.getDropTargetDelegate(mDragObject);
if (delegate != null) {
target = delegate;
- target.getLocationOnScreen(dropCoordinates);
+ target.getLocationInDragLayer(dropCoordinates);
}
// Make dropCoordinates relative to the DropTarget
@@ -604,28 +596,6 @@ public class DragController {
return null;
}
- /**
- * Get the screen size so we can clamp events to the screen size so even if
- * you drag off the edge of the screen, we find something.
- */
- private void recordScreenSize() {
- ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
- .getDefaultDisplay().getMetrics(mDisplayMetrics);
- }
-
- /**
- * Clamp val to be &gt;= min and &lt; max.
- */
- private static int clamp(int val, int min, int max) {
- if (val < min) {
- return min;
- } else if (val >= max) {
- return max - 1;
- } else {
- return val;
- }
- }
-
public void setDragScoller(DragScroller scroller) {
mDragScroller = scroller;
}
@@ -672,7 +642,7 @@ public class DragController {
/**
* Specifies the delete region. We won't scroll on touch events over the delete region.
*
- * @param region The rectangle in screen coordinates of the delete region.
+ * @param region The rectangle in DragLayer coordinates of the delete region.
*/
void setDeleteRegion(RectF region) {
mDeleteRegion = region;