From: Heeyong Song Date: Tue, 8 Oct 2019 02:22:33 +0000 (+0900) Subject: (Vector) Pause animation when the actor is invisible X-Git-Tag: dali_1.4.42~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=f5829e20b7d09df9fd925b928818737e2cd22e1e (Vector) Pause animation when the actor is invisible Change-Id: Ie9b5cd221e099f711cc63cafa5b1a12f42f7ea82 --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp index 98a2d3d..794a0cd 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "dummy-control.h" using namespace Dali; @@ -1225,3 +1226,47 @@ int UtcDaliAnimatedVectorImageVisualMultipleInstances(void) END_TEST; } + +int UtcDaliAnimatedVectorImageVisualVisibilityChanged(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliAnimatedVectorImageVisualVisibilityChanged" ); + + Property::Map propertyMap; + propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE ) + .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ); + + Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + DummyControl actor = DummyControl::New( true ); + DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() ); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + + Vector2 controlSize( 20.f, 30.f ); + actor.SetSize( controlSize ); + + Stage::GetCurrent().Add( actor ); + + application.SendNotification(); + application.Render(); + + Property::Map attributes; + DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes ); + + // Check rendering behavior + DALI_TEST_CHECK( actor.GetRendererCount() == 1u ); + Renderer renderer = actor.GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); + DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::CONTINUOUSLY ); + + actor.SetVisible( false ); + + application.SendNotification(); + application.Render(); + + // Check rendering behavior again + DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::IF_REQUIRED ); + + END_TEST; +} diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp index 070836c..de415df 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp @@ -305,6 +305,8 @@ void AnimatedVectorImageVisual::DoSetOnStage( Actor& actor ) mSizeNotification = actor.AddPropertyNotification( Actor::Property::SIZE, StepCondition( 3.0f ) ); mSizeNotification.NotifySignal().Connect( this, &AnimatedVectorImageVisual::OnSizeNotification ); + DevelActor::VisibilityChangedSignal( actor ).Connect( this, &AnimatedVectorImageVisual::OnVisibilityChanged ); + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::DoSetOnStage [%p]\n", this ); } @@ -328,6 +330,8 @@ void AnimatedVectorImageVisual::DoSetOffStage( Actor& actor ) actor.RemovePropertyNotification( mScaleNotification ); actor.RemovePropertyNotification( mSizeNotification ); + DevelActor::VisibilityChangedSignal( actor ).Connect( this, &AnimatedVectorImageVisual::OnVisibilityChanged ); + mPlacementActor.Reset(); // Reset the visual size to zero so that when adding the actor back to stage the rasterization is forced @@ -564,6 +568,26 @@ void AnimatedVectorImageVisual::OnSizeNotification( PropertyNotification& source } } +void AnimatedVectorImageVisual::OnVisibilityChanged( Actor actor, bool visible, DevelActor::VisibilityChange::Type type ) +{ + if( !visible ) + { + if( mActionStatus == DevelAnimatedVectorImageVisual::Action::PLAY ) + { + mVectorAnimationTask->PauseAnimation(); + + if( mImpl->mRenderer ) + { + mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::IF_REQUIRED ); + } + + mActionStatus = DevelAnimatedVectorImageVisual::Action::PAUSE; + + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnVisibilityChanged: invisibile. Pause animation [%p]\n", this ); + } + } +} + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h index 674cb1b..78848d0 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h @@ -22,6 +22,7 @@ #include #include #include +#include // INTERNAL INCLUDES #include @@ -175,6 +176,11 @@ private: */ void OnSizeNotification( PropertyNotification& source ); + /** + * @brief Callback when the visibility of the actor is changed. + */ + void OnVisibilityChanged( Actor actor, bool visible, DevelActor::VisibilityChange::Type type ); + // Undefined AnimatedVectorImageVisual( const AnimatedVectorImageVisual& visual ) = delete;