From 9db0a074bbad5b5f1f29f22b0e39e8fb3f108a32 Mon Sep 17 00:00:00 2001 From: Paul Wisbey Date: Thu, 22 May 2014 18:45:52 +0100 Subject: [PATCH] Fix for flick gesture in Screen Reader mode [problem] Flick gestures do not work with 2 fingers [cause] Incorrect velocity calculation [solution] Use correct 'previous position' in Gesture::Finished event --- .../internal/focus-manager/focus-manager-impl.cpp | 12 ++++++++++-- .../dali-toolkit/internal/focus-manager/focus-manager-impl.h | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp index a52d480..2ca17e5 100644 --- a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp +++ b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp @@ -877,13 +877,21 @@ bool FocusManager::HandlePanGesture(const Integration::PanGestureEvent& panEvent } } + // Gesture::Finished (Up) events are delivered with previous (Motion) event position + // Use the real previous position; otherwise we may incorrectly get a ZERO velocity + if ( Gesture::Finished != panEvent.state ) + { + // Store the previous position for next Gesture::Finished iteration. + mPreviousPosition = panEvent.previousPosition; + } + Actor rootActor = Stage::GetCurrent().GetRootLayer(); Dali::PanGesture pan(panEvent.state); pan.time = panEvent.time; pan.numberOfTouches = panEvent.numberOfTouches; pan.screenPosition = panEvent.currentPosition; - pan.screenDisplacement = panEvent.previousPosition - panEvent.currentPosition; + pan.screenDisplacement = mPreviousPosition - panEvent.currentPosition; pan.screenVelocity.x = pan.screenDisplacement.x / panEvent.timeDelta; pan.screenVelocity.y = pan.screenDisplacement.y / panEvent.timeDelta; @@ -898,7 +906,7 @@ bool FocusManager::HandlePanGesture(const Integration::PanGestureEvent& panEvent pan.position = localCurrent; Vector2 localPrevious; - control.ScreenToLocal( localPrevious.x, localPrevious.y, panEvent.previousPosition.x, panEvent.previousPosition.y ); + control.ScreenToLocal( localPrevious.x, localPrevious.y, mPreviousPosition.x, mPreviousPosition.y ); pan.displacement = localCurrent - localPrevious; pan.velocity.x = pan.displacement.x / panEvent.timeDelta; diff --git a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h index de2cd39..c69557c 100644 --- a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h +++ b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h @@ -386,6 +386,8 @@ private: Actor mFocusIndicatorActor; ///< The focus indicator actor shared by all the focusable actors for highlight + Vector2 mPreviousPosition; ///< The previous pan position; useful for calculating velocity for Gesture::Finished events + unsigned int mRecursiveFocusMoveCounter; ///< The counter to count the number of recursive focus movement attempted before the focus movement is successful. bool mIsAccessibilityTtsEnabled; ///< Whether accessibility feature(screen-reader) turned on/off -- 2.7.4