diff options
author | Adam Cohen <adamcohen@google.com> | 2011-03-11 15:29:03 -0800 |
---|---|---|
committer | Adam Cohen <adamcohen@google.com> | 2011-03-14 12:16:52 -0700 |
commit | 6788269814a678af976dfc7d6135993e172ce586 (patch) | |
tree | 111f6fdf283c1896d20deb0e95ece7fda9c1d7f6 /src/com/android/launcher2/DragLayer.java | |
parent | 5a0d66c36e69a3b4e5deb800750efe64163f0264 (diff) | |
download | android_packages_apps_Trebuchet-6788269814a678af976dfc7d6135993e172ce586.tar.gz android_packages_apps_Trebuchet-6788269814a678af976dfc7d6135993e172ce586.tar.bz2 android_packages_apps_Trebuchet-6788269814a678af976dfc7d6135993e172ce586.zip |
Fixing widget resize visual / ux ugliness, Bug: 4082591
Change-Id: Ib258e02f52dd83418db0c0249efdc90d2424f059
Diffstat (limited to 'src/com/android/launcher2/DragLayer.java')
-rw-r--r-- | src/com/android/launcher2/DragLayer.java | 168 |
1 files changed, 151 insertions, 17 deletions
diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java index eb539450f..c2b710ec7 100644 --- a/src/com/android/launcher2/DragLayer.java +++ b/src/com/android/launcher2/DragLayer.java @@ -16,10 +16,11 @@ package com.android.launcher2; -import com.android.launcher.R; +import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; +import android.graphics.Rect; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; @@ -27,6 +28,8 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; +import com.android.launcher.R; + /** * A ViewGroup that coordinates dragging across its descendants */ @@ -34,6 +37,12 @@ public class DragLayer extends FrameLayout { private DragController mDragController; private int[] mTmpXY = new int[2]; + // Variables relating to resizing widgets + private final ArrayList<AppWidgetResizeFrame> mResizeFrames = + new ArrayList<AppWidgetResizeFrame>(); + private AppWidgetResizeFrame mCurrentResizeFrame; + private int mXDown, mYDown; + /** * Used to create a new DragLayer from XML. * @@ -56,31 +65,66 @@ public class DragLayer extends FrameLayout { return mDragController.dispatchKeyEvent(event) || super.dispatchKeyEvent(event); } + private boolean handleTouchDown(MotionEvent ev) { + Rect hitRect = new Rect(); + int x = (int) ev.getX(); + int y = (int) ev.getY(); + + for (AppWidgetResizeFrame child: mResizeFrames) { + child.getHitRect(hitRect); + if (hitRect.contains(x, y)) { + if (child.beginResizeIfPointInRegion(x - child.getLeft(), y - child.getTop())) { + mCurrentResizeFrame = child; + mXDown = x; + mYDown = y; + requestDisallowInterceptTouchEvent(true); + return true; + } + } + } + return false; + } + @Override public boolean onInterceptTouchEvent(MotionEvent ev) { - // If the current CellLayoutChildren has a resize frame, we need to detect if any touch - // event has occurred which doesn't result in resizing a widget. In this case, we - // dismiss any visible resize frames. - final Workspace w = (Workspace) findViewById(R.id.workspace); - if (w != null) { - final CellLayout currentPage = (CellLayout) w.getChildAt(w.getCurrentPage()); - final CellLayoutChildren childrenLayout = currentPage.getChildrenLayout(); - - if (childrenLayout.hasResizeFrames() && !childrenLayout.isWidgetBeingResized()) { - post(new Runnable() { - public void run() { - if (!childrenLayout.isWidgetBeingResized()) { - childrenLayout.clearAllResizeFrames(); - } - } - }); + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + if (handleTouchDown(ev)) { + return true; } } + clearAllResizeFrames(); return mDragController.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { + boolean handled = false; + int action = ev.getAction(); + + int x = (int) ev.getX(); + int y = (int) ev.getY(); + + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + if (handleTouchDown(ev)) { + return true; + } + } + } + + if (mCurrentResizeFrame != null) { + handled = true; + switch (action) { + case MotionEvent.ACTION_MOVE: + mCurrentResizeFrame.visualizeResizeForDelta(x - mXDown, y - mYDown); + break; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + mCurrentResizeFrame.commitResizeForDelta(x - mXDown, y - mYDown); + mCurrentResizeFrame = null; + } + } + if (handled) return true; return mDragController.onTouchEvent(ev); } @@ -103,4 +147,94 @@ public class DragLayer extends FrameLayout { v.getLocationOnScreen(mTmpXY); return createDragView(mDragController.getViewBitmap(v), mTmpXY[0], mTmpXY[1]); } + + public static class LayoutParams extends FrameLayout.LayoutParams { + public int x, y; + public boolean customPosition = false; + + /** + * {@inheritDoc} + */ + public LayoutParams(int width, int height) { + super(width, height); + } + + public void setWidth(int width) { + this.width = width; + } + + public int getWidth() { + return width; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getHeight() { + return height; + } + + public void setX(int x) { + this.x = x; + } + + public int getX() { + return x; + } + + public void setY(int y) { + this.y = y; + } + + public int getY() { + return y; + } + } + + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + int count = getChildCount(); + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + final FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams) child.getLayoutParams(); + if (flp instanceof LayoutParams) { + final LayoutParams lp = (LayoutParams) flp; + if (lp.customPosition) { + child.layout(lp.x, lp.y, lp.x + lp.width, lp.y + lp.height); + } + } + } + } + + public void clearAllResizeFrames() { + if (mResizeFrames.size() > 0) { + for (AppWidgetResizeFrame frame: mResizeFrames) { + removeView(frame); + } + mResizeFrames.clear(); + } + } + + public boolean hasResizeFrames() { + return mResizeFrames.size() > 0; + } + + public boolean isWidgetBeingResized() { + return mCurrentResizeFrame != null; + } + + public void addResizeFrame(ItemInfo itemInfo, LauncherAppWidgetHostView widget, + CellLayout cellLayout) { + AppWidgetResizeFrame resizeFrame = new AppWidgetResizeFrame(getContext(), + itemInfo, widget, cellLayout, this); + + LayoutParams lp = new LayoutParams(-1, -1); + lp.customPosition = true; + + addView(resizeFrame, lp); + mResizeFrames.add(resizeFrame); + + resizeFrame.snapToWidget(false); + } } |