END_TEST;
}
+int UtcDaliImageViewTransitionEffect04(void)
+{
+ tet_infoline("Test transitoin effect operation when image is changed quickly ");
+
+ ToolkitTestApplication application;
+ Property::Map map;
+
+ ImageView imageView = ImageView::New();
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
+ imageView.SetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT, true);
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ imageView.SetImage("");
+ application.GetScene().Add(imageView);
+
+ ImageView imageView2 = ImageView::New();
+ imageView2.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
+ imageView2.SetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT, true);
+ imageView2.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ imageView2.SetImage("");
+ application.GetScene().Add(imageView2);
+ application.SendNotification();
+ application.Render();
+
+ //PLACEHOLDER_IMAGE is not call WaitForEventThreadTrigger because it is not shown url is null.
+ //DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+ imageView.SetImage(gImage_600_RGB);
+ imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ imageView2.SetImage(TEST_IMAGE_1);
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
+
+ imageView.SetImage(TEST_IMAGE_1);
+ imageView2.SetImage(gImage_600_RGB);
+ application.SendNotification();
+ application.Render(3000);
+
+ imageView.SetImage("");
+ application.SendNotification();
+ application.Render();
+
+ imageView.SetImage(TEST_IMAGE_2);
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ Property::Value value;
+ value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
+ bool transition;
+ DALI_TEST_CHECK(value.Get(transition));
+ DALI_TEST_CHECK(transition == true);
+
+ // Clear all cached
+ imageView.Unparent();
+ imageView.Reset();
+
+ END_TEST;
+}
+
int UtcDaliImageViewImageLoadFailureAndReload01(void)
{
tet_infoline("Try to load invalid image first, and then reload after that image valid.");
constexpr float LOW_OPACITY = 0.2f;
constexpr float TRANSITION_EFFECT_SPEED = 0.3f;
+constexpr int PLACEHOLDER_DEPTH_INDEX = -2;
+constexpr int PREVIOUS_VISUAL_DEPTH_INDEX = -1;
+constexpr int CURRENT_VISUAL_DEPTH_INDEX = 0;
+
BaseHandle Create()
{
return Toolkit::ImageView::New();
mImageVisualPaddingSetByTransform(false),
mImageViewPixelAreaSetByFittingMode(false),
mTransitionEffect(false),
- mNeedLazyFittingMode(false)
+ mNeedLazyFittingMode(false),
+ mImageReplaced(false)
{
}
{
if(mTransitionAnimation.GetState() == Animation::PLAYING)
{
- mTransitionAnimation.Stop();
+ // Hide placeholder
+ HidePlaceholderImage();
ClearTransitionAnimation();
}
}
mPropertyMap = map;
mUrl.clear();
+ mImageReplaced = true;
+
// keep alpha for transition effect
if(mTransitionEffect)
{
// Trigger a size negotiation request that may be needed when unregistering a visual.
RelayoutRequest();
}
-
// Signal that a Relayout may be needed
}
{
if(mTransitionAnimation.GetState() == Animation::PLAYING)
{
- mTransitionAnimation.Stop();
+ HidePlaceholderImage();
ClearTransitionAnimation();
}
}
mPreviousVisual = mVisual;
}
+
+
// Don't bother comparing if we had a visual previously, just drop old visual and create new one
mUrl = url;
mImageSize = size;
mPropertyMap.Clear();
+ mImageReplaced = true;
+
if(!mVisual)
{
ShowPlaceholderImage();
// Trigger a size negotiation request that may be needed when unregistering a visual.
RelayoutRequest();
}
-
// Signal that a Relayout may be needed
}
{
visual.SetTransformAndSize(Property::Map(), size);
}
+
+ if(!mTransitionEffect)
+ {
+ // we don't need placeholder anymore because visual is replaced. so hide placeholder.
+ HidePlaceholderImage();
+ }
}
}
// when placeholder is disabled or ready placeholder and image, we need to transition effect
TransitionImageWithEffect();
}
- else
- {
- ClearTransitionAnimation();
- }
- }
- else
- {
- // we don't need placeholder anymore because visual is replaced. so hide placeholder.
- HidePlaceholderImage();
}
// Visual ready so update visual attached to this ImageView, following call to RelayoutRequest will use this visual.
if(mPlaceholderVisual)
{
mPlaceholderVisual.SetName("placeholder");
+ mPlaceholderVisual.SetDepthIndex(mPlaceholderVisual.GetDepthIndex() + PLACEHOLDER_DEPTH_INDEX);
}
else
{
if(handle)
{
+ if(!mImageReplaced)
+ {
+ // If the image is not replaced, the transition effect is not required.
+ return;
+ }
+
+ if(mTransitionAnimation)
+ {
+ ClearTransitionAnimation();
+ }
+
+ // Control visual's depth for transition effect
+ if(mPreviousVisual)
+ {
+ mPreviousVisual.SetDepthIndex(mPreviousVisual.GetDepthIndex() + PREVIOUS_VISUAL_DEPTH_INDEX);
+ }
+
mTransitionAnimation = Animation::New(TRANSITION_EFFECT_SPEED);
mTransitionAnimation.SetEndAction(Animation::EndAction::DISCARD);
float destinationAlpha = (mTransitionTargetAlpha > LOW_OPACITY) ? mTransitionTargetAlpha : LOW_OPACITY;
fadeinKeyFrames.Add(0.0f, LOW_OPACITY);
fadeinKeyFrames.Add(1.0f, destinationAlpha);
mTransitionAnimation.AnimateBetween(DevelControl::GetVisualProperty(handle, Toolkit::ImageView::Property::IMAGE, Toolkit::Visual::Property::OPACITY), fadeinKeyFrames, AlphaFunction::EASE_IN_OUT);
+ imageVisual.SetDepthIndex(imageVisual.GetDepthIndex() + CURRENT_VISUAL_DEPTH_INDEX);
}
// Play transition animation
void ImageView::ClearTransitionAnimation()
{
- // Hide placeholder
- HidePlaceholderImage();
-
// Clear PreviousVisual
if(mPreviousVisual)
{
if(mTransitionAnimation)
{
+ if(mTransitionAnimation.GetState() == Animation::PLAYING)
+ {
+ mTransitionAnimation.Stop();
+ }
mTransitionAnimation.FinishedSignal().Disconnect(this, &ImageView::OnTransitionAnimationFinishedCallback);
mTransitionAnimation.Clear();
+ mTransitionAnimation.Reset();
+
+ // After transition effect is cleared, we don't need transition effect until image is replaced.
+ mImageReplaced = false;
}
}
void ImageView::OnTransitionAnimationFinishedCallback(Animation& animation)
{
+ // Hide placeholder
+ HidePlaceholderImage();
ClearTransitionAnimation();
}