summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher2/DragController.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher2/DragController.java')
-rw-r--r--src/com/android/launcher2/DragController.java96
1 files changed, 82 insertions, 14 deletions
diff --git a/src/com/android/launcher2/DragController.java b/src/com/android/launcher2/DragController.java
index b4f972bb2..e18470ab2 100644
--- a/src/com/android/launcher2/DragController.java
+++ b/src/com/android/launcher2/DragController.java
@@ -99,7 +99,7 @@ public class DragController {
/** Who can receive drop events */
private ArrayList<DropTarget> mDropTargets = new ArrayList<DropTarget>();
- private DragListener mListener;
+ private ArrayList<DragListener> mListeners = new ArrayList<DragListener>();
/** The window token used as the parent for the DragView. */
private IBinder mWindowToken;
@@ -151,7 +151,7 @@ public class DragController {
/**
* Starts a drag.
- *
+ *
* @param v The view that is being dragged
* @param source An object representing where the drag originated
* @param dragInfo The data associated with the object that is being dragged
@@ -159,6 +159,22 @@ public class DragController {
* {@link #DRAG_ACTION_COPY}
*/
public void startDrag(View v, DragSource source, Object dragInfo, int dragAction) {
+ startDrag(v, source, dragInfo, dragAction, null);
+ }
+
+ /**
+ * Starts a drag.
+ *
+ * @param v The view that is being dragged
+ * @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}
+ * @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(View v, DragSource source, Object dragInfo, int dragAction,
+ Rect dragRegion) {
mOriginator = v;
Bitmap b = getViewBitmap(v);
@@ -174,7 +190,7 @@ public class DragController {
int screenY = loc[1];
startDrag(b, screenX, screenY, 0, 0, b.getWidth(), b.getHeight(),
- source, dragInfo, dragAction);
+ source, dragInfo, dragAction, dragRegion);
b.recycle();
@@ -185,7 +201,7 @@ public class DragController {
/**
* Starts a drag.
- *
+ *
* @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.
@@ -202,6 +218,31 @@ public class DragController {
public void startDrag(Bitmap b, int screenX, int screenY,
int textureLeft, int textureTop, int textureWidth, int textureHeight,
DragSource source, Object dragInfo, int dragAction) {
+ startDrag(b, screenX, screenY, textureLeft, textureTop, textureWidth, textureHeight,
+ source, dragInfo, dragAction, null);
+ }
+
+ /**
+ * Starts a drag.
+ *
+ * @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 textureLeft The left edge of the region inside b to use.
+ * @param textureTop The top edge of the region inside b to use.
+ * @param textureWidth The width of the region inside b to use.
+ * @param textureHeight The height of the region inside b to use.
+ * @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}
+ * @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,
+ int textureLeft, int textureTop, int textureWidth, int textureHeight,
+ DragSource source, Object dragInfo, int dragAction, Rect dragRegion) {
if (PROFILE_DRAWING_DURING_DRAG) {
android.os.Debug.startMethodTracing("Launcher");
}
@@ -213,15 +254,17 @@ public class DragController {
}
mInputMethodManager.hideSoftInputFromWindow(mWindowToken, 0);
- if (mListener != null) {
- mListener.onDragStart(source, dragInfo, dragAction);
+ for (DragListener listener : mListeners) {
+ listener.onDragStart(source, dragInfo, dragAction);
}
int registrationX = ((int)mMotionDownX) - screenX;
int registrationY = ((int)mMotionDownY) - screenY;
- mTouchOffsetX = mMotionDownX - screenX;
- mTouchOffsetY = mMotionDownY - screenY;
+ final int dragRegionLeft = dragRegion == null ? 0 : dragRegion.left;
+ final int dragRegionTop = dragRegion == null ? 0 : dragRegion.top;
+ mTouchOffsetX = mMotionDownX - screenX - dragRegionLeft;
+ mTouchOffsetY = mMotionDownY - screenY - dragRegionTop;
mDragging = true;
mDragSource = source;
@@ -231,6 +274,12 @@ public class DragController {
DragView dragView = mDragView = new DragView(mContext, b, registrationX, registrationY,
textureLeft, textureTop, textureWidth, textureHeight);
+
+ if (dragRegion != null) {
+ dragView.setDragRegion(dragRegionLeft, dragRegion.top,
+ dragRegion.right - dragRegionLeft, dragRegion.bottom - dragRegionTop);
+ }
+
dragView.show(mWindowToken, (int)mMotionDownX, (int)mMotionDownY);
}
@@ -297,8 +346,8 @@ public class DragController {
if (mOriginator != null) {
mOriginator.setVisibility(View.VISIBLE);
}
- if (mListener != null) {
- mListener.onDragEnd();
+ for (DragListener listener : mListeners) {
+ listener.onDragEnd();
}
if (mDragView != null) {
mDragView.remove();
@@ -395,6 +444,13 @@ public class DragController {
final int[] coordinates = mCoordinatesTemp;
DropTarget dropTarget = findDropTarget(screenX, screenY, coordinates);
if (dropTarget != null) {
+ DropTarget delegate = dropTarget.getDropTargetDelegate(
+ mDragSource, coordinates[0], coordinates[1],
+ (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
+ if (delegate != null) {
+ dropTarget = delegate;
+ }
+
if (mLastDropTarget == dropTarget) {
dropTarget.onDragOver(mDragSource, coordinates[0], coordinates[1],
(int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
@@ -482,13 +538,25 @@ public class DragController {
final ArrayList<DropTarget> dropTargets = mDropTargets;
final int count = dropTargets.size();
for (int i=count-1; i>=0; i--) {
- final DropTarget target = dropTargets.get(i);
+ DropTarget target = dropTargets.get(i);
target.getHitRect(r);
+
+ // Convert the hit rect to screen coordinates
target.getLocationOnScreen(dropCoordinates);
r.offset(dropCoordinates[0] - target.getLeft(), dropCoordinates[1] - target.getTop());
+
if (r.contains(x, y)) {
+ DropTarget delegate = target.getDropTargetDelegate(mDragSource,
+ x, y, (int)mTouchOffsetX, (int)mTouchOffsetY, mDragView, mDragInfo);
+ if (delegate != null) {
+ target = delegate;
+ target.getLocationOnScreen(dropCoordinates);
+ }
+
+ // Make dropCoordinates relative to the DropTarget
dropCoordinates[0] = x - dropCoordinates[0];
dropCoordinates[1] = y - dropCoordinates[1];
+
return target;
}
}
@@ -528,15 +596,15 @@ public class DragController {
/**
* Sets the drag listner which will be notified when a drag starts or ends.
*/
- public void setDragListener(DragListener l) {
- mListener = l;
+ public void addDragListener(DragListener l) {
+ mListeners.add(l);
}
/**
* Remove a previously installed drag listener.
*/
public void removeDragListener(DragListener l) {
- mListener = null;
+ mListeners.remove(l);
}
/**