dadb304b46
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
78 lines
2.9 KiB
Java
78 lines
2.9 KiB
Java
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;
|
|
}
|
|
}
|