private void ShowViewImmediate(IAnimatedView view) { // this is a SUPER special case where we want to pop the view on immediately with no animation currentView = viewStack.Peek(); // this should be the share choice dialog currentView.LeavingPercent(1.0f); currentView.OutOfView(view); SetViewActive(currentView, false); viewStack.Pop(); // pop off the share choice dialog currentView = viewStack.Peek(); viewStack.Push(view); SetViewActive(view, true); view.EnteringPercent(1.0f); view.InView(currentView); currentView = view; }
IEnumerator TransitionView(IAnimatedView oldView, IAnimatedView newView, float crossfadePercent = 0.0f) { // crossfade delay transitionPending = true; float startTime = Time.time; float newStartTime = startTime; float newEndTime = startTime; bool oldViewDone = true; bool newViewStarted = false; if (oldView != null) { newStartTime = startTime + (1 - crossfadePercent) * oldView.OutTime; TriggerViewAnimation(oldView, oldView.OutTrigger); oldViewDone = false; oldView.LeavingView(newView); } if (newView != null) { newEndTime = newStartTime + newView.InTime; } while (true) { float ellapsed = Time.time - startTime; if (!oldViewDone) { float p = Mathf.Clamp01(ellapsed / oldView.OutTime); oldView.LeavingPercent(p); if (p == 1.0f) { oldView.OutOfView(newView); SetViewActive(oldView, false); oldViewDone = true; } } if (!newViewStarted && Time.time >= newStartTime) { SetViewActive(newView, true); newView.EnteringView(oldView); TriggerViewAnimation(newView, newView.InTrigger); newViewStarted = true; currentView = newView; } if (newViewStarted) { float p = Mathf.Clamp01((Time.time - newStartTime) / newView.InTime); newView.EnteringPercent(p); if (p == 1.0f) { newView.InView(oldView); break; } } yield return(null); } transitionPending = false; DumpViewStack(); if (nextView != null) { // special case for Back show mode for now... if (nextViewShowMode == ShowMode.Back) { Back(); } else { ShowView(nextView, nextViewShowMode); } } }