diff options
Diffstat (limited to 'quickstep/src/com/android/quickstep/util/MotionPauseDetector.java')
-rw-r--r-- | quickstep/src/com/android/quickstep/util/MotionPauseDetector.java | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java index 7969eec7c..1156b87b3 100644 --- a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java +++ b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java @@ -36,12 +36,15 @@ public class MotionPauseDetector { private final float mSpeedSomewhatFast; private final float mSpeedFast; private final float mMinDisplacementForPause; + private final float mMaxOrthogonalDisplacementForPause; private Long mPreviousTime = null; private Float mPreviousPosition = null; private Float mPreviousVelocity = null; + private TotalDisplacement mTotalDisplacement = new TotalDisplacement(); private Float mFirstPosition = null; + private Float mFirstOrthogonalPosition = null; private OnMotionPauseListener mOnMotionPauseListener; private boolean mIsPaused; @@ -54,6 +57,8 @@ public class MotionPauseDetector { mSpeedSomewhatFast = res.getDimension(R.dimen.motion_pause_detector_speed_somewhat_fast); mSpeedFast = res.getDimension(R.dimen.motion_pause_detector_speed_fast); mMinDisplacementForPause = res.getDimension(R.dimen.motion_pause_detector_min_displacement); + mMaxOrthogonalDisplacementForPause = res.getDimension( + R.dimen.motion_pause_detector_max_orthogonal_displacement); } /** @@ -70,20 +75,26 @@ public class MotionPauseDetector { /** * Computes velocity and acceleration to determine whether the motion is paused. * @param position The x or y component of the motion being tracked. + * @param orthogonalPosition The x or y component (opposite of {@param position}) of the motion. * * TODO: Use historical positions as well, e.g. {@link MotionEvent#getHistoricalY(int, int)}. */ - public void addPosition(float position) { + public void addPosition(float position, float orthogonalPosition) { if (mFirstPosition == null) { mFirstPosition = position; } + if (mFirstOrthogonalPosition == null) { + mFirstOrthogonalPosition = orthogonalPosition; + } long time = SystemClock.uptimeMillis(); if (mPreviousTime != null && mPreviousPosition != null) { long changeInTime = Math.max(1, time - mPreviousTime); float changeInPosition = position - mPreviousPosition; float velocity = changeInPosition / changeInTime; if (mPreviousVelocity != null) { - checkMotionPaused(velocity, mPreviousVelocity, Math.abs(position - mFirstPosition)); + mTotalDisplacement.set(Math.abs(position - mFirstPosition), + Math.abs(orthogonalPosition - mFirstOrthogonalPosition)); + checkMotionPaused(velocity, mPreviousVelocity, mTotalDisplacement); } mPreviousVelocity = velocity; } @@ -91,7 +102,8 @@ public class MotionPauseDetector { mPreviousPosition = position; } - private void checkMotionPaused(float velocity, float prevVelocity, float totalDisplacement) { + private void checkMotionPaused(float velocity, float prevVelocity, + TotalDisplacement totalDisplacement) { float speed = Math.abs(velocity); float previousSpeed = Math.abs(prevVelocity); boolean isPaused; @@ -113,8 +125,10 @@ public class MotionPauseDetector { } } } - boolean passedMinDisplacement = totalDisplacement >= mMinDisplacementForPause; - isPaused &= passedMinDisplacement; + boolean passedMinDisplacement = totalDisplacement.primary >= mMinDisplacementForPause; + boolean passedMaxOrthogonalDisplacement = + totalDisplacement.orthogonal >= mMaxOrthogonalDisplacementForPause; + isPaused &= passedMinDisplacement && !passedMaxOrthogonalDisplacement; if (mIsPaused != isPaused) { mIsPaused = isPaused; if (mIsPaused) { @@ -131,6 +145,8 @@ public class MotionPauseDetector { mPreviousPosition = null; mPreviousVelocity = null; mFirstPosition = null; + mFirstOrthogonalPosition = null; + mTotalDisplacement.set(0, 0); setOnMotionPauseListener(null); mIsPaused = mHasEverBeenPaused = false; } @@ -142,4 +158,18 @@ public class MotionPauseDetector { public interface OnMotionPauseListener { void onMotionPauseChanged(boolean isPaused); } + + /** + * Contains the displacement from the first tracked position, + * along both the primary and orthogonal axes. + */ + private class TotalDisplacement { + public float primary; + public float orthogonal; + + public void set(float primaryDisplacement, float orthogonalDisplacement) { + this.primary = primaryDisplacement; + this.orthogonal = orthogonalDisplacement; + } + } } |