summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher2
diff options
context:
space:
mode:
authorAdam Cohen <adamcohen@google.com>2010-11-15 10:50:58 -0800
committerAdam Cohen <adamcohen@google.com>2010-11-18 16:32:19 -0800
commit68d739365bf650fe7fecf99cd3bfe63a0d41bd12 (patch)
treedff870226d43c0751c70c3b3f4c98e6c8efc45f5 /src/com/android/launcher2
parentc0bd58837acbb7e7e879437192b818e03ac02ff3 (diff)
downloadandroid_packages_apps_Trebuchet-68d739365bf650fe7fecf99cd3bfe63a0d41bd12.tar.gz
android_packages_apps_Trebuchet-68d739365bf650fe7fecf99cd3bfe63a0d41bd12.tar.bz2
android_packages_apps_Trebuchet-68d739365bf650fe7fecf99cd3bfe63a0d41bd12.zip
Adding overscroll to Workspace, AllApps and Customize
-Also modified the background alpha interpolation during scrolling Change-Id: I68db8fbe80f720c507ab3208d8b3dcd8aa4f2081
Diffstat (limited to 'src/com/android/launcher2')
-rw-r--r--src/com/android/launcher2/PagedView.java78
-rw-r--r--src/com/android/launcher2/SmoothPagedView.java8
-rw-r--r--src/com/android/launcher2/Workspace.java56
3 files changed, 101 insertions, 41 deletions
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index fb8b7d64d..a2ed9858a 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -27,7 +27,6 @@ import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.ActionMode;
import android.view.MotionEvent;
import android.view.VelocityTracker;
@@ -36,10 +35,9 @@ import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.animation.Animation;
-import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
+import android.view.animation.Animation.AnimationListener;
import android.widget.Checkable;
-import android.widget.LinearLayout;
import android.widget.Scroller;
import com.android.launcher.R;
@@ -60,6 +58,8 @@ public abstract class PagedView extends ViewGroup {
private static final int PAGE_SNAP_ANIMATION_DURATION = 750;
protected static final float NANOTIME_DIV = 1000000000.0f;
+ private static final float OVERSCROLL_DAMP_FACTOR = 0.22f;
+
// the velocity at which a fling gesture will cause us to snap to the next page
protected int mSnapVelocity = 500;
@@ -70,6 +70,7 @@ public abstract class PagedView extends ViewGroup {
protected int mCurrentPage;
protected int mNextPage = INVALID_PAGE;
+ protected int mMaxScrollX;
protected Scroller mScroller;
private VelocityTracker mVelocityTracker;
@@ -103,6 +104,8 @@ public abstract class PagedView extends ViewGroup {
protected int mCellCountX;
protected int mCellCountY;
protected boolean mCenterPagesVertically;
+ protected boolean mAllowOverScroll = true;
+ protected int mUnboundedScrollX;
protected static final int INVALID_POINTER = -1;
@@ -312,8 +315,28 @@ public abstract class PagedView extends ViewGroup {
}
@Override
+ public void scrollBy(int x, int y) {
+ scrollTo(mUnboundedScrollX + x, mScrollY + y);
+ }
+
+ @Override
public void scrollTo(int x, int y) {
- super.scrollTo(x, y);
+ mUnboundedScrollX = x;
+
+ if (x < 0) {
+ super.scrollTo(0, y);
+ if (mAllowOverScroll) {
+ overScroll(x);
+ }
+ } else if (x > mMaxScrollX) {
+ super.scrollTo(mMaxScrollX, y);
+ if (mAllowOverScroll) {
+ overScroll(x - mMaxScrollX);
+ }
+ } else {
+ super.scrollTo(x, y);
+ }
+
mTouchX = x;
mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
}
@@ -395,6 +418,7 @@ public abstract class PagedView extends ViewGroup {
heightSize = maxChildHeight + verticalPadding;
}
+ mMaxScrollX = getChildOffset(childCount - 1) - getRelativeChildOffset(childCount - 1);
setMeasuredDimension(widthSize, heightSize);
}
@@ -799,6 +823,16 @@ public abstract class PagedView extends ViewGroup {
return false;
}
+ protected void overScroll(float amount) {
+ int overScrollAmount = (int) Math.round(OVERSCROLL_DAMP_FACTOR * amount);
+ if (amount < 0) {
+ mScrollX = overScrollAmount;
+ } else {
+ mScrollX = mMaxScrollX + overScrollAmount;
+ }
+ invalidate();
+ }
+
@Override
public boolean onTouchEvent(MotionEvent ev) {
// Skip touch handling if there are no pages to swipe
@@ -834,31 +868,13 @@ public abstract class PagedView extends ViewGroup {
final int deltaX = (int) (mLastMotionX - x);
mLastMotionX = x;
- int sx = getScrollX();
- if (deltaX < 0) {
- if (sx > 0) {
- mTouchX += Math.max(-mTouchX, deltaX);
- mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
- if (!mDeferScrollUpdate) {
- scrollBy(Math.max(-sx, deltaX), 0);
- } else {
- // This will trigger a call to computeScroll() on next drawChild() call
- invalidate();
- }
- }
- } else if (deltaX > 0) {
- final int lastChildIndex = getChildCount() - 1;
- final int availableToScroll = getChildOffset(lastChildIndex) -
- getRelativeChildOffset(lastChildIndex) - sx;
- if (availableToScroll > 0) {
- mTouchX += Math.min(availableToScroll, deltaX);
- mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
- if (!mDeferScrollUpdate) {
- scrollBy(Math.min(availableToScroll, deltaX), 0);
- } else {
- // This will trigger a call to computeScroll() on next drawChild() call
- invalidate();
- }
+ if (deltaX != 0) {
+ mTouchX += deltaX;
+ mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
+ if (!mDeferScrollUpdate) {
+ scrollBy(deltaX, 0);
+ } else {
+ invalidate();
}
} else {
awakenScrollBars();
@@ -1042,7 +1058,7 @@ public abstract class PagedView extends ViewGroup {
whichPage = Math.max(0, Math.min(whichPage, getPageCount() - 1));
int newX = getChildOffset(whichPage) - getRelativeChildOffset(whichPage);
- final int sX = getScrollX();
+ final int sX = mUnboundedScrollX;
final int delta = newX - sX;
snapToPage(whichPage, delta, duration);
}
@@ -1063,7 +1079,7 @@ public abstract class PagedView extends ViewGroup {
}
if (!mScroller.isFinished()) mScroller.abortAnimation();
- mScroller.startScroll(getScrollX(), 0, delta, 0, duration);
+ mScroller.startScroll(mUnboundedScrollX, 0, delta, 0, duration);
// only load some associated pages
loadAssociatedPages(mNextPage);
diff --git a/src/com/android/launcher2/SmoothPagedView.java b/src/com/android/launcher2/SmoothPagedView.java
index 8e729e431..ee8bca20e 100644
--- a/src/com/android/launcher2/SmoothPagedView.java
+++ b/src/com/android/launcher2/SmoothPagedView.java
@@ -138,7 +138,7 @@ public abstract class SmoothPagedView extends PagedView {
final int screenDelta = Math.max(1, Math.abs(whichPage - mCurrentPage));
final int newX = getChildOffset(whichPage) - getRelativeChildOffset(whichPage);
- final int delta = newX - mScrollX;
+ final int delta = newX - mUnboundedScrollX;
int duration;
if (mScrollMode == OVERSHOOT_MODE) {
duration = (screenDelta + 1) * 100;
@@ -180,8 +180,9 @@ public abstract class SmoothPagedView extends PagedView {
if (!scrollComputed && mTouchState == TOUCH_STATE_SCROLLING) {
final float now = System.nanoTime() / NANOTIME_DIV;
final float e = (float) Math.exp((now - mSmoothingTime) / SMOOTHING_CONSTANT);
- final float dx = mTouchX - mScrollX;
- mScrollX += dx * e;
+
+ final float dx = mTouchX - mUnboundedScrollX;
+ scrollTo(Math.round(mUnboundedScrollX + dx * e), mScrollY);
mSmoothingTime = now;
// Keep generating points as long as we're more than 1px away from the target
@@ -189,5 +190,6 @@ public abstract class SmoothPagedView extends PagedView {
invalidate();
}
}
+
}
}
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 7a264e35a..69be0083f 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -20,14 +20,13 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
-import android.R.integer;
import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
+import android.animation.Animator.AnimatorListener;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.AlertDialog;
import android.app.WallpaperManager;
@@ -92,8 +91,8 @@ public class Workspace extends SmoothPagedView
private static final float EXTRA_SCALE_FACTOR_1 = 1.0f;
private static final float EXTRA_SCALE_FACTOR_2 = 1.10f;
- private static final int CHILDREN_OUTLINE_FADE_OUT_DELAY = 300;
- private static final int CHILDREN_OUTLINE_FADE_OUT_DURATION = 300;
+ private static final int CHILDREN_OUTLINE_FADE_OUT_DELAY = 0;
+ private static final int CHILDREN_OUTLINE_FADE_OUT_DURATION = 375;
private static final int CHILDREN_OUTLINE_FADE_IN_DURATION = 100;
private static final int BACKGROUND_FADE_OUT_DURATION = 450;
@@ -109,6 +108,7 @@ public class Workspace extends SmoothPagedView
private ObjectAnimator mBackgroundFadeOutAnimation;
private Drawable mBackground;
private float mBackgroundAlpha = 0;
+ private float mOverScrollMaxBackgroundAlpha = 0.0f;
private final WallpaperManager mWallpaperManager;
@@ -515,7 +515,7 @@ public class Workspace extends SmoothPagedView
mAnimOnPageEndMoving.start();
mAnimOnPageEndMoving = null;
}
-
+ mOverScrollMaxBackgroundAlpha = 0.0f;
mPageMoving = false;
}
@@ -638,9 +638,51 @@ public class Workspace extends SmoothPagedView
return (width - mTempFloat2[0]) * (degrees > 0.0f ? 1.0f : -1.0f);
}
+ float backgroundAlphaInterpolator(float r) {
+ float pivotA = 0.1f;
+ float pivotB = 0.4f;
+ if (r < pivotA) {
+ return 0;
+ } else if (r > pivotB) {
+ return 1.0f;
+ } else {
+ return (r - pivotA)/(pivotB - pivotA);
+ }
+ }
+
+ float overScrollBackgroundAlphaInterpolator(float r) {
+ float threshold = 0.1f;
+
+ if (r > mOverScrollMaxBackgroundAlpha) {
+ mOverScrollMaxBackgroundAlpha = r;
+ } else if (r < mOverScrollMaxBackgroundAlpha) {
+ r = mOverScrollMaxBackgroundAlpha;
+ }
+
+ return Math.min(r / threshold, 1.0f);
+ }
+
+ protected void overScroll(float amount) {
+ final int lastChildIndex = getChildCount() - 1;
+
+ CellLayout cl;
+ if (amount < 0) {
+ cl = (CellLayout) getChildAt(0);
+ } else {
+ cl = (CellLayout) getChildAt(lastChildIndex);
+ }
+
+ final int totalDistance = cl.getMeasuredWidth() + mPageSpacing;
+ float r = 1.0f * amount / totalDistance;
+ float rotation = -WORKSPACE_ROTATION * r;
+ cl.setBackgroundAlphaMultiplier(overScrollBackgroundAlphaInterpolator(Math.abs(r)));
+ cl.setRotationY(rotation);
+ }
+
@Override
protected void screenScrolled(int screenCenter) {
final int halfScreenSize = getMeasuredWidth() / 2;
+
for (int i = 0; i < getChildCount(); i++) {
CellLayout cl = (CellLayout) getChildAt(i);
if (cl != null) {
@@ -652,11 +694,12 @@ public class Workspace extends SmoothPagedView
scrollProgress = Math.min(scrollProgress, 1.0f);
scrollProgress = Math.max(scrollProgress, -1.0f);
- cl.setBackgroundAlphaMultiplier(Math.abs(scrollProgress));
+ cl.setBackgroundAlphaMultiplier(backgroundAlphaInterpolator(Math.abs(scrollProgress)));
float rotation = WORKSPACE_ROTATION * scrollProgress;
float translationX = getOffsetXForRotation(rotation, cl.getWidth(), cl.getHeight());
cl.setTranslationX(translationX);
+
cl.setRotationY(rotation);
}
}
@@ -1431,7 +1474,6 @@ public class Workspace extends SmoothPagedView
}
});
-
view.setVisibility(View.INVISIBLE);
if (!mScroller.isFinished()) {