summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/PinchThresholdManager.java
diff options
context:
space:
mode:
authorTony Wickham <twickham@google.com>2016-02-24 11:07:00 -0800
committerTony Wickham <twickham@google.com>2016-03-04 16:52:54 -0800
commitdadb304b4682998c43b9c07bef45b9a9380f3287 (patch)
tree57fcadbe3ee6a1f0d7b656cbb51bfc400b9554a3 /src/com/android/launcher3/PinchThresholdManager.java
parentcd50a0fade590098b4322140c5fede04c6e7eb8e (diff)
downloadandroid_packages_apps_Trebuchet-dadb304b4682998c43b9c07bef45b9a9380f3287.tar.gz
android_packages_apps_Trebuchet-dadb304b4682998c43b9c07bef45b9a9380f3287.tar.bz2
android_packages_apps_Trebuchet-dadb304b4682998c43b9c07bef45b9a9380f3287.zip
Pinch to zoom out into overview mode.
There are 3 classes coordinating the gesture: PinchToOverviewListener, PinchThresholdManager, and PinchAnimationManager. - PTOL listens for the pinch gesture on DragLayer. - When a pinch is detected, the PTOL keeps track of the interpolated progress and passes it along to both the PTM and PAM. - The PTM uses the progress to determine whether a new threshold has been passed, and tells the PAM to animate it if so. - The PAM uses the progress to animate things like workspace scale throughout the pinch. - If the pinch ends early, the PTOL uses the last passed threshold to determine whether to animate to workspace or overview, and tells PAM to perform the animation at the same velocity as the pinch. Bug: 24414635 Change-Id: I9e53706c705f8b2982409bf7c223d8d0e9618bf0
Diffstat (limited to 'src/com/android/launcher3/PinchThresholdManager.java')
-rw-r--r--src/com/android/launcher3/PinchThresholdManager.java77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/com/android/launcher3/PinchThresholdManager.java b/src/com/android/launcher3/PinchThresholdManager.java
new file mode 100644
index 000000000..d79a63174
--- /dev/null
+++ b/src/com/android/launcher3/PinchThresholdManager.java
@@ -0,0 +1,77 @@
+package com.android.launcher3;
+
+/**
+ * Keeps track of when thresholds are passed during a pinch gesture,
+ * used to inform {@link PinchAnimationManager} throughout.
+ *
+ * @see PinchToOverviewListener
+ * @see PinchAnimationManager
+ */
+public class PinchThresholdManager {
+ public static final float THRESHOLD_ZERO = 0.0f;
+ public static final float THRESHOLD_ONE = 0.40f;
+ public static final float THRESHOLD_TWO = 0.70f;
+ public static final float THRESHOLD_THREE = 0.95f;
+
+ private Workspace mWorkspace;
+
+ private float mPassedThreshold = THRESHOLD_ZERO;
+
+ public PinchThresholdManager(Workspace workspace) {
+ mWorkspace = workspace;
+ }
+
+ /**
+ * Uses the pinch progress to determine whether a threshold has been passed,
+ * and asks the {@param animationManager} to animate if so.
+ * @param progress From 0 to 1, where 0 is overview and 1 is workspace.
+ * @param animationManager Animates the threshold change if one is passed.
+ * @return The last passed threshold, one of
+ * {@link PinchThresholdManager#THRESHOLD_ZERO},
+ * {@link PinchThresholdManager#THRESHOLD_ONE},
+ * {@link PinchThresholdManager#THRESHOLD_TWO}, or
+ * {@link PinchThresholdManager#THRESHOLD_THREE}
+ */
+ public float updateAndAnimatePassedThreshold(float progress,
+ PinchAnimationManager animationManager) {
+ if (!mWorkspace.isInOverviewMode()) {
+ // Invert the progress, because going from workspace to overview is 1 to 0.
+ progress = 1f - progress;
+ }
+
+ float previousPassedThreshold = mPassedThreshold;
+
+ if (progress < THRESHOLD_ONE) {
+ mPassedThreshold = THRESHOLD_ZERO;
+ } else if (progress < THRESHOLD_TWO) {
+ mPassedThreshold = THRESHOLD_ONE;
+ } else if (progress < THRESHOLD_THREE) {
+ mPassedThreshold = THRESHOLD_TWO;
+ } else {
+ mPassedThreshold = THRESHOLD_THREE;
+ }
+
+ if (mPassedThreshold != previousPassedThreshold) {
+ Workspace.State fromState = mWorkspace.isInOverviewMode() ? Workspace.State.OVERVIEW
+ : Workspace.State.NORMAL;
+ Workspace.State toState = mWorkspace.isInOverviewMode() ? Workspace.State.NORMAL
+ : Workspace.State.OVERVIEW;
+ float thresholdToAnimate = mPassedThreshold;
+ if (mPassedThreshold < previousPassedThreshold) {
+ // User reversed pinch, so heading back to the state that they started from.
+ toState = fromState;
+ thresholdToAnimate = previousPassedThreshold;
+ }
+ animationManager.animateThreshold(thresholdToAnimate, fromState, toState);
+ }
+ return mPassedThreshold;
+ }
+
+ public float getPassedThreshold() {
+ return mPassedThreshold;
+ }
+
+ public void reset() {
+ mPassedThreshold = THRESHOLD_ZERO;
+ }
+}