diff options
| author | 2011-06-02 17:25:59 -0700 | |
|---|---|---|
| committer | 2011-06-02 17:25:59 -0700 | |
| commit | 10c3f367a3eb66081c06f1d75107d26e64ce248f (patch) | |
| tree | 9d638966a7da38a9d14262818e07612d7236b341 /libs/ui/Input.cpp | |
| parent | a86290891a661ecdc8115fd441b44dcebedb9e3d (diff) | |
| parent | 19c97d46fb57f87ff45d9e6ea7122b4eb21ede8c (diff) | |
Merge "Implement pointer acceleration." into honeycomb-mr2
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() {  |