summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/Folder.java
diff options
context:
space:
mode:
authorMindy DelliCarpini <mindyp@google.com>2013-06-27 08:45:11 -0700
committerMindy DelliCarpini <mindyp@google.com>2013-06-27 10:13:01 -0700
commit2e7471cf96bb8d9d02a9f2010ec198d585363dd7 (patch)
tree97e179fa9291d8356b94b5a10858d595bac9fd65 /src/com/android/launcher3/Folder.java
parentfe4b98a4b757976413c882d2f7c46418be97e507 (diff)
downloadandroid_packages_apps_Trebuchet-2e7471cf96bb8d9d02a9f2010ec198d585363dd7.tar.gz
android_packages_apps_Trebuchet-2e7471cf96bb8d9d02a9f2010ec198d585363dd7.tar.bz2
android_packages_apps_Trebuchet-2e7471cf96bb8d9d02a9f2010ec198d585363dd7.zip
Accelerate scrolling based on duration of drag near edge
TODO: tune max/ min scrolling velocity Tune scroll trigger zones Change-Id: I1daf10f12617fa9362cb340d5ed7bac98b23c9be
Diffstat (limited to 'src/com/android/launcher3/Folder.java')
-rw-r--r--src/com/android/launcher3/Folder.java46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java
index 9eafc2231..be511fb9b 100644
--- a/src/com/android/launcher3/Folder.java
+++ b/src/com/android/launcher3/Folder.java
@@ -40,6 +40,8 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.Interpolator;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.LinearLayout;
@@ -107,9 +109,22 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
FolderEditText mFolderName;
private float mFolderIconPivotX;
private float mFolderIconPivotY;
+ private long mDragScrollStart;
+
+ /** Interpolator used to scale velocity with touch position, may be null. */
+ private Interpolator mEdgeInterpolator = new AccelerateInterpolator();
private static final int SCROLL_CUT_OFF_AMOUNT = 60;
- private static final int SCROLL_BAND_HEIGHT = 110;
+
+ private final float mDurationToMax = 300f;
+ private final float mMaxVelocity = 100000f/1000f;
+
+ // Aim for this amount of target area to trigger scrolling
+ private static float sScrollBandFactor = -1f;
+ private static float sScrollBandMaxFactor = -1f;
+
+ // Min size for the target area to trigger scrolling
+ private static int sMinScrollBandHeight = -1;
private boolean mIsEditingName = false;
private InputMethodManager mInputMethodManager;
@@ -178,6 +193,15 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
if (sHintText == null) {
sHintText = res.getString(R.string.folder_hint_text);
}
+ if (sMinScrollBandHeight == -1) {
+ sMinScrollBandHeight = res.getDimensionPixelSize(R.dimen.min_scroll_band_size);
+ }
+ if (sScrollBandFactor == -1f) {
+ sScrollBandFactor = res.getInteger(R.integer.scroll_band_factor)/100f;
+ }
+ if (sScrollBandMaxFactor == -1f) {
+ sScrollBandMaxFactor = res.getInteger(R.integer.scroll_band_max_factor)/100f;
+ }
mLauncher = (Launcher) context;
// We need this view to be focusable in touch mode so that when text editing of the folder
// name is complete, we have something to focus on, thus hiding the cursor and giving
@@ -653,7 +677,9 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
public void onDragOver(DragObject d) {
int scrollOffset = mScrollView.getScrollY();
-
+ int height = getMeasuredHeight();
+ int scrollBandHeight = Math.min((int) (height * sScrollBandMaxFactor),
+ (Math.max(sMinScrollBandHeight, (int) (height * sScrollBandFactor))));
float[] r = getDragViewVisualCenter(d.x, d.y, d.xOffset, d.yOffset, d.dragView, null);
r[0] -= getPaddingLeft();
r[1] -= getPaddingTop();
@@ -665,17 +691,19 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
mTargetCell[0] = mContent.getCountX() - mTargetCell[0] - 1;
}
- if (r[1] < SCROLL_BAND_HEIGHT && mScrollView.getScrollY() > 0) {
+ if (r[1] < scrollBandHeight && mScrollView.getScrollY() > 0) {
// Scroll up
if (mDragMode != DRAG_MODE_SCROLL_UP) {
mDragMode = DRAG_MODE_SCROLL_UP;
+ mDragScrollStart = System.currentTimeMillis();
scrollUp();
}
mReorderAlarm.cancelAlarm();
- } else if (r[1] > (getFolderHeight() - SCROLL_BAND_HEIGHT) && mScrollView.getScrollY() <
+ } else if (r[1] > (getFolderHeight() - scrollBandHeight) && mScrollView.getScrollY() <
(mContent.getMeasuredHeight() - mScrollView.getMeasuredHeight())) {
if (mDragMode != DRAG_MODE_SCROLL_DOWN) {
mDragMode = DRAG_MODE_SCROLL_DOWN;
+ mDragScrollStart = System.currentTimeMillis();
scrollDown();
}
mReorderAlarm.cancelAlarm();
@@ -705,9 +733,15 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
}
};
+ private int getVelocity() {
+ float duration = (System.currentTimeMillis() - mDragScrollStart)/mDurationToMax;
+ return (int) Math.min(mMaxVelocity,
+ (int) (mEdgeInterpolator.getInterpolation(duration) * mMaxVelocity));
+ }
+
private void scrollUp() {
if (mDragMode == DRAG_MODE_SCROLL_UP) {
- mScrollView.setScrollY(mScrollView.getScrollY() - 7);
+ mScrollView.setScrollY(mScrollView.getScrollY() - getVelocity());
invalidate();
post(mScrollUpRunnable);
}
@@ -715,7 +749,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
private void scrollDown() {
if (mDragMode == DRAG_MODE_SCROLL_DOWN) {
- mScrollView.setScrollY(mScrollView.getScrollY() + 7);
+ mScrollView.setScrollY(mScrollView.getScrollY() + getVelocity());
invalidate();
post(mScrollDownRunnable);
}