X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftransition%2Ftransition-set-impl.cpp;h=d1b16af2d0fbc50286dda8d7617d7ba2d1c54b1c;hp=fd019b6ad32946c24785325f1b8db5a24e7e72f7;hb=HEAD;hpb=0eae547923469b94437148be16a3d840a8a8a51f diff --git a/dali-toolkit/internal/transition/transition-set-impl.cpp b/dali-toolkit/internal/transition/transition-set-impl.cpp index fd019b6..d1b16af 100644 --- a/dali-toolkit/internal/transition/transition-set-impl.cpp +++ b/dali-toolkit/internal/transition/transition-set-impl.cpp @@ -37,6 +37,13 @@ namespace // Signals static constexpr std::string_view SIGNAL_FINISHED = "finished"; +static constexpr float OPACITY_TRANSPARENT = 0.0f; + +float CustomAlphaFunction(float progress) +{ + return (progress >= 1.0f) ? 1.0f : 0.0f; +} + BaseHandle Create() { return Dali::Toolkit::TransitionSet::New(); @@ -117,9 +124,46 @@ void TransitionSet::TransitionPreProcess() void TransitionSet::TransitionStart() { + std::vector> minimumDelays; for(auto&& transition : mTransitions) { transition->Play(); + + // If target Control has appearing transition, the target will not be rendered during delay. + // And if the Control has multiple transitions, the target will not be rendered during minimum delay of the transitions. + // Here we can find minimum delay of each target. + if(!transition->IsPairTransition() && transition->IsAppearingTransition()) + { + bool found = false; + for(uint32_t index = 0; index < minimumDelays.size(); ++index) + { + if(minimumDelays[index].first == transition->GetTarget()) + { + minimumDelays[index].second = std::min(minimumDelays[index].second, transition->GetTimePeriod().delaySeconds); + found = true; + break; + } + } + if(!found) + { + minimumDelays.push_back(std::pair(transition->GetTarget(), transition->GetTimePeriod().delaySeconds)); + } + } + } + + // If the target has delay that is larger than 0, hide the target during minimum delay. + // The custom alpha function make the target hide just during delay. + for(auto&& delay : minimumDelays) + { + if(delay.second > Dali::Math::MACHINE_EPSILON_10) + { + Dali::KeyFrames initialKeyframes = Dali::KeyFrames::New(); + initialKeyframes.Add(0.0f, OPACITY_TRANSPARENT); + initialKeyframes.Add(1.0f, delay.first.GetProperty(Dali::Actor::Property::OPACITY)); + + AlphaFunction alpha(&CustomAlphaFunction); + mAnimation.AnimateBetween(Property(delay.first, Dali::Actor::Property::OPACITY), initialKeyframes, alpha, TimePeriod(delay.second)); + } } mAnimation.FinishedSignal().Connect(this, &TransitionSet::TransitionFinished);