From: Julien Heanley Date: Wed, 25 Jun 2014 13:23:31 +0000 (+0100) Subject: ScrollView - Added APIs for minimum pan speed/distance before being considered a... X-Git-Tag: dali_1.0.0~16 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=a342499604e471b0e0d80eac30eb28e898b06c69;hp=5ac4bb2cc34e65b05c3909508e9ac53d4672ebf2 ScrollView - Added APIs for minimum pan speed/distance before being considered a flick [problem] Application could not change minimum flick speed and distance [solution] Added APIs to change minimum flick speed/distance Change-Id: Ia1941662a04fe8ec3d058bd926c9e0f6a4b73b23 Signed-off-by: Julien Heanley Signed-off-by: Adeel Kazmi --- diff --git a/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp b/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp index 20392a7..578fd89 100644 --- a/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp +++ b/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp @@ -48,7 +48,8 @@ namespace { const int DEFAULT_REFRESH_INTERVAL_MILLISECONDS = 50; ///< Refresh rate TODO: Animation should have an update signal (and see item-view-impl) -const float FLICK_SPEED_THRESHOLD = 500.0f; ///< Flick threshold in pixels/ms +const Vector2 DEFAULT_MIN_FLICK_DISTANCE(30.0f, 30.0f); ///< minimum distance for pan before flick allowed +const float DEFAULT_MIN_FLICK_SPEED_THRESHOLD(500.0f); ///< Minimum pan speed required for flick in pixels/s const float FREE_FLICK_SPEED_THRESHOLD = 200.0f; ///< Free-Flick threshold in pixels/ms const float AUTOLOCK_AXIS_MINIMUM_DISTANCE2 = 100.0f; ///< Auto-lock axis after minimum distance squared. const float FLICK_ORTHO_ANGLE_RANGE = 75.0f; ///< degrees. (if >45, then supports diagonal flicking) @@ -605,6 +606,8 @@ ScrollView::ScrollView() mSnapOvershootAlphaFunction(AlphaFunctions::EaseOut), mSnapDuration(Toolkit::ScrollView::DEFAULT_SLOW_SNAP_ANIMATION_DURATION), mSnapAlphaFunction(AlphaFunctions::EaseOut), + mMinFlickDistance(DEFAULT_MIN_FLICK_DISTANCE), + mFlickSpeedThreshold(DEFAULT_MIN_FLICK_SPEED_THRESHOLD), mFlickDuration(Toolkit::ScrollView::DEFAULT_FAST_SNAP_ANIMATION_DURATION), mFlickAlphaFunction(AlphaFunctions::EaseOut), mAxisAutoLockGradient(Toolkit::ScrollView::DEFAULT_AXIS_AUTO_LOCK_GRADIENT), @@ -1202,6 +1205,26 @@ void ScrollView::SetFlickSpeedCoefficient(float speed) mFlickSpeedCoefficient = speed; } +Vector2 ScrollView::GetMinimumDistanceForFlick() const +{ + return mMinFlickDistance; +} + +void ScrollView::SetMinimumDistanceForFlick( const Vector2& distance ) +{ + mMinFlickDistance = distance; +} + +float ScrollView::GetMinimumSpeedForFlick() const +{ + return mFlickSpeedThreshold; +} + +void ScrollView::SetMinimumSpeedForFlick( float speed ) +{ + mFlickSpeedThreshold = speed; +} + float ScrollView::GetMaxFlickSpeed() const { return mMaxFlickSpeed; @@ -1546,7 +1569,7 @@ bool ScrollView::SnapWithVelocity(Vector2 velocity) // that will be accepted as a general N,E,S,W flick direction. const float orthoAngleRange = FLICK_ORTHO_ANGLE_RANGE * M_PI / 180.0f; - const float flickSpeedThreshold2 = FLICK_SPEED_THRESHOLD*FLICK_SPEED_THRESHOLD; + const float flickSpeedThreshold2 = mFlickSpeedThreshold * mFlickSpeedThreshold; Vector3 positionSnap = mScrollPrePosition; @@ -2703,6 +2726,13 @@ void ScrollView::OnGestureEx(Gesture::State state) mGestureStackDepth--; if(mGestureStackDepth==0) { + // no flick if we have not exceeded min flick distance + if( (fabsf(mPanDelta.x) < mMinFlickDistance.x) + && (fabsf(mPanDelta.y) < mMinFlickDistance.y) ) + { + // reset flick velocity + mLastVelocity = Vector2::ZERO; + } FinishTransform(); } else @@ -2724,6 +2754,7 @@ void ScrollView::FinishTransform() PreAnimatedScrollSetup(); + // convert pixels/millisecond to pixels per second bool animating = SnapWithVelocity(mLastVelocity * 1000.0f); if(!animating) diff --git a/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h b/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h index ae1a41a..20215a4 100644 --- a/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h +++ b/base/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h @@ -328,6 +328,26 @@ public: void SetFlickSpeedCoefficient(float speed); /** + * @copydoc Toolkit::ScrollView::GetMinimumDistanceForFlick + */ + Vector2 GetMinimumDistanceForFlick() const; + + /** + * @copydoc Toolkit::ScrollView::SetMinimumDistanceForFlick + */ + void SetMinimumDistanceForFlick( const Vector2& distance ); + + /** + * @copydoc Toolkit::ScrollView::GetMinimumSpeedForFlick + */ + float GetMinimumSpeedForFlick() const; + + /** + * @copydoc Toolkit::ScrollView::SetMinimumSpeedForFlick + */ + void SetMinimumSpeedForFlick( float speed ); + + /** * @copydoc Toolkit::ScrollView::GetMaxFlickSpeed */ float GetMaxFlickSpeed() const; @@ -954,6 +974,8 @@ private: float mSnapDuration; ///< Time for the snap animation to take (in seconds). AlphaFunction mSnapAlphaFunction; ///< AlphaFunction to be used for the Snap Animation. + Vector2 mMinFlickDistance; ///< Minimum pan distance required for a flick + float mFlickSpeedThreshold; ///< Minimum pan speed required for a flick in pixels/ms float mFlickDuration; ///< Time for the flick animation to take (in seconds). AlphaFunction mFlickAlphaFunction; ///< AlphaFunction to be used for the Flick Animation. diff --git a/base/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.cpp b/base/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.cpp index ff8fd79..aba1054 100644 --- a/base/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.cpp +++ b/base/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.cpp @@ -488,6 +488,26 @@ void ScrollView::SetFlickSpeedCoefficient(float speed) GetImpl(*this).SetFlickSpeedCoefficient(speed); } +Vector2 ScrollView::GetMinimumDistanceForFlick() const +{ + return GetImpl(*this).GetMinimumDistanceForFlick(); +} + +void ScrollView::SetMinimumDistanceForFlick( const Vector2& distance ) +{ + GetImpl(*this).SetMinimumDistanceForFlick(distance); +} + +float ScrollView::GetMinimumSpeedForFlick() const +{ + return GetImpl(*this).GetMinimumSpeedForFlick(); +} + +void ScrollView::SetMinimumSpeedForFlick( float speed ) +{ + GetImpl(*this).SetMinimumSpeedForFlick(speed); +} + float ScrollView::GetMaxFlickSpeed() const { return GetImpl(*this).GetMaxFlickSpeed(); diff --git a/capi/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h b/capi/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h index 58fbbfc..25ce6c8 100644 --- a/capi/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h +++ b/capi/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h @@ -828,6 +828,36 @@ public: void SetFlickSpeedCoefficient(float speed); /** + * @brief Returns the minimum pan distance required for a flick gesture in pixels + * + * @return Minimum pan distance vector with separate x and y distance + */ + Vector2 GetMinimumDistanceForFlick() const; + + /** + * @brief Sets the minimum pan distance required for a flick in pixels + * + * Takes a Vector2 containing separate x and y values. As long as the pan distance exceeds one of these axes a flick will be allowed + * + * @param[in] distance The minimum pan distance for a flick + */ + void SetMinimumDistanceForFlick( const Vector2& distance ); + + /** + * @brief Returns the minimum pan speed required for a flick gesture in pixels per second + * + * @return Minimum pan speed + */ + float GetMinimumSpeedForFlick() const; + + /** + * @brief Sets the minimum pan speed required for a flick in pixels per second + * + * @param[in] speed The minimum pan speed for a flick + */ + void SetMinimumSpeedForFlick( float speed ); + + /** * @brief Gets the maximum flick speed setting for ScrollView when * flicking in free panning mode. *