From: Julien Heanley Date: Tue, 10 Jun 2014 07:53:24 +0000 (+0100) Subject: ScrollView - Fix for pixel value used as animation time X-Git-Tag: dali_1.0.0~63 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=2685b40c3f05eb62d648835a1b28814498436e2c;ds=sidebyside ScrollView - Fix for pixel value used as animation time [problem] Animation from scroll view had large time preventing update thread from sleeping [solution] Clamp animation time Change-Id: I0d8a26aee100cedf6fb04f69724446dfe3f60354 Signed-off-by: Julien Heanley --- 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 d0f05ae..8f54df0 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 @@ -2223,9 +2223,7 @@ void ScrollView::OnScrollAnimationFinished( Animation& source ) scrollingFinished = true; } mInternalXAnimation.Reset(); - - // erase current state flags - mScrollStateFlags &= ~SCROLL_X_STATE_MASK; + SnapInternalXTo(mScrollPostPosition.x); } if( source == mInternalYAnimation ) @@ -2235,9 +2233,7 @@ void ScrollView::OnScrollAnimationFinished( Animation& source ) scrollingFinished = true; } mInternalYAnimation.Reset(); - - // erase current state flags - mScrollStateFlags &= ~SCROLL_Y_STATE_MASK; + SnapInternalYTo(mScrollPostPosition.y); } if(scrollingFinished) @@ -2246,6 +2242,71 @@ void ScrollView::OnScrollAnimationFinished( Animation& source ) } } +void ScrollView::OnSnapInternalPositionFinished( Animation& source ) +{ + Actor self = Self(); + UpdateLocalScrollProperties(); + if( source == mInternalXAnimation ) + { + // clear internal x animation flags + mScrollStateFlags &= ~SCROLL_X_STATE_MASK; + mInternalXAnimation.Reset(); + WrapPosition(mScrollPrePosition); + } + if( source == mInternalYAnimation ) + { + mScrollStateFlags &= ~SCROLL_Y_STATE_MASK; + mInternalYAnimation.Reset(); + WrapPosition(mScrollPrePosition); + } +} + +void ScrollView::SnapInternalXTo(float position) +{ + Actor self = Self(); + + StopAnimation(mInternalXAnimation); + + // erase current state flags + mScrollStateFlags &= ~SCROLL_X_STATE_MASK; + + // if internal x not equal to inputed parameter, animate it + float duration = std::min(fabsf((position - mScrollPrePosition.x) / mMaxOvershoot.x) * mSnapOvershootDuration, mSnapOvershootDuration); + if( duration > Math::MACHINE_EPSILON_1 ) + { + mInternalXAnimation = Animation::New(duration); + mInternalXAnimation.FinishedSignal().Connect(this, &ScrollView::OnSnapInternalPositionFinished); + mInternalXAnimation.AnimateTo(Property(self, mPropertyPrePosition, 0), position); + mInternalXAnimation.Play(); + + // add internal animation state flag + mScrollStateFlags |= SnappingInternalX; + } +} + +void ScrollView::SnapInternalYTo(float position) +{ + Actor self = Self(); + + StopAnimation(mInternalYAnimation); + + // erase current state flags + mScrollStateFlags &= ~SCROLL_Y_STATE_MASK; + + // if internal y not equal to inputed parameter, animate it + float duration = std::min(fabsf((position - mScrollPrePosition.y) / mMaxOvershoot.y) * mSnapOvershootDuration, mSnapOvershootDuration); + if( duration > Math::MACHINE_EPSILON_1 ) + { + mInternalYAnimation = Animation::New(duration); + mInternalYAnimation.FinishedSignal().Connect(this, &ScrollView::OnSnapInternalPositionFinished); + mInternalYAnimation.AnimateTo(Property(self, mPropertyPrePosition, 1), position); + mInternalYAnimation.Play(); + + // add internal animation state flag + mScrollStateFlags |= SnappingInternalY; + } +} + void ScrollView::GestureStarted() { // we handle the first gesture. 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 1315a66..1591fb6 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 @@ -649,6 +649,27 @@ private: void OnScrollAnimationFinished( Animation& source ); /** + * Called when either the X or Y internal scroll positions have finished snapping back to mPropertyPrePosition + * + * @param[in] source the Animation instance that has completed. + */ + void OnSnapInternalPositionFinished( Animation& source ); + + /** + * Called whenever a snap animation on the x-axis has completed and we need to snap pre scroll + * position to our clamped position + * @param[in] position The x position to snap pre scroll property to + */ + void SnapInternalXTo( float position ); + + /** + * Called whenever a snap animation on the y-axis has completed and we need to snap pre scroll + * position to our clamped position + * @param[in] position The y position to snap pre scroll property to + */ + void SnapInternalYTo( float position ); + + /** * This is called internally whenever the Scroll Rulers are * modified. This will update the properties: 'scroll-position-min' * and 'scroll-position-max' to reflect the changes.