diff options
| author | 2011-06-02 17:27:48 -0700 | |
|---|---|---|
| committer | 2011-06-02 17:27:48 -0700 | |
| commit | 8186a5f065fac2b82c90cd18d79cd234bc221402 (patch) | |
| tree | ce823459463a77a26a3cc5b37a7db8cc4033a26d /libs/ui/Input.cpp | |
| parent | 5b8342cf193a0255b254a5d833e6a2fac04b4b10 (diff) | |
| parent | 10c3f367a3eb66081c06f1d75107d26e64ce248f (diff) | |
am 10c3f367: Merge "Implement pointer acceleration." into honeycomb-mr2
* commit '10c3f367a3eb66081c06f1d75107d26e64ce248f':
  Implement pointer acceleration.
Diffstat (limited to 'libs/ui/Input.cpp')
| -rw-r--r-- | libs/ui/Input.cpp | 89 | 
1 files changed, 89 insertions, 0 deletions
diff --git a/libs/ui/Input.cpp b/libs/ui/Input.cpp index 684c332d11a7..50b75d504e6a 100644 --- a/libs/ui/Input.cpp +++ b/libs/ui/Input.cpp @@ -13,6 +13,10 @@  // Log debug messages about velocity tracking.  #define DEBUG_VELOCITY 0 +// Log debug messages about acceleration. +#define DEBUG_ACCELERATION 0 + +  #include <stdlib.h>  #include <unistd.h>  #include <ctype.h> @@ -20,6 +24,7 @@  #include <ui/Input.h>  #include <math.h> +#include <limits.h>  #ifdef HAVE_ANDROID_OS  #include <binder/Parcel.h> @@ -670,6 +675,11 @@ bool MotionEvent::isTouchEvent(int32_t source, int32_t action) {  // --- VelocityTracker --- +const uint32_t VelocityTracker::HISTORY_SIZE; +const nsecs_t VelocityTracker::MAX_AGE; +const nsecs_t VelocityTracker::MIN_WINDOW; +const nsecs_t VelocityTracker::MIN_DURATION; +  VelocityTracker::VelocityTracker() {      clear();  } @@ -879,6 +889,85 @@ bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const  } +// --- VelocityControl --- + +const nsecs_t VelocityControl::STOP_TIME; + +VelocityControl::VelocityControl() { +    reset(); +} + +void VelocityControl::setParameters(const VelocityControlParameters& parameters) { +    mParameters = parameters; +    reset(); +} + +void VelocityControl::reset() { +    mLastMovementTime = LLONG_MIN; +    mRawPosition.x = 0; +    mRawPosition.y = 0; +    mVelocityTracker.clear(); +} + +void VelocityControl::move(nsecs_t eventTime, float* deltaX, float* deltaY) { +    if ((deltaX && *deltaX) || (deltaY && *deltaY)) { +        if (eventTime >= mLastMovementTime + STOP_TIME) { +#if DEBUG_ACCELERATION +            LOGD("VelocityControl: stopped, last movement was %0.3fms ago", +                    (eventTime - mLastMovementTime) * 0.000001f); +#endif +            reset(); +        } + +        mLastMovementTime = eventTime; +        if (deltaX) { +            mRawPosition.x += *deltaX; +        } +        if (deltaY) { +            mRawPosition.y += *deltaY; +        } +        mVelocityTracker.addMovement(eventTime, BitSet32(BitSet32::valueForBit(0)), &mRawPosition); + +        float vx, vy; +        float scale = mParameters.scale; +        if (mVelocityTracker.getVelocity(0, &vx, &vy)) { +            float speed = hypotf(vx, vy) * scale; +            if (speed >= mParameters.highThreshold) { +                // Apply full acceleration above the high speed threshold. +                scale *= mParameters.acceleration; +            } else if (speed > mParameters.lowThreshold) { +                // Linearly interpolate the acceleration to apply between the low and high +                // speed thresholds. +                scale *= 1 + (speed - mParameters.lowThreshold) +                        / (mParameters.highThreshold - mParameters.lowThreshold) +                        * (mParameters.acceleration - 1); +            } + +#if DEBUG_ACCELERATION +            LOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): " +                    "vx=%0.3f, vy=%0.3f, speed=%0.3f, accel=%0.3f", +                    mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold, +                    mParameters.acceleration, +                    vx, vy, speed, scale / mParameters.scale); +#endif +        } else { +#if DEBUG_ACCELERATION +            LOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): unknown velocity", +                    mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold, +                    mParameters.acceleration); +#endif +        } + +        if (deltaX) { +            *deltaX *= scale; +        } +        if (deltaY) { +            *deltaY *= scale; +        } +    } +} + +  // --- InputDeviceInfo ---  InputDeviceInfo::InputDeviceInfo() {  |