public Task Transition(IShellItemRenderer oldRenderer, IShellItemRenderer newRenderer) { TaskCompletionSource <bool> task = new TaskCompletionSource <bool>(); var oldView = oldRenderer.ViewController.View; var newView = newRenderer.ViewController.View; oldView.Layer.RemoveAllAnimations(); newView.Alpha = 0; oldView.Superview.InsertSubviewAbove(newView, oldView); UIView.Animate(0.5, 0, UIViewAnimationOptions.BeginFromCurrentState, () => newView.Alpha = 1, () => { task.TrySetResult(true); }); return(task.Task); }
protected virtual void SwitchFragment(FragmentManager manager, AView targetView, ShellItem newItem, bool animate = true) { Profile.FrameBegin(); Profile.FramePartition("IsDesignerContext"); if (AndroidContext.IsDesignerContext()) { return; } Profile.FramePartition("CreateShellItemRenderer"); var previousRenderer = _currentRenderer; _currentRenderer = CreateShellItemRenderer(newItem); _currentRenderer.ShellItem = newItem; var fragment = _currentRenderer.Fragment; Profile.FramePartition("Transaction"); FragmentTransaction transaction = manager.BeginTransaction(); if (animate) { transaction.SetTransitionEx((int)global::Android.App.FragmentTransit.EnterMask); } transaction.ReplaceEx(_frameLayout.Id, fragment); transaction.CommitAllowingStateLossEx(); Profile.FramePartition("OnDestroyed"); void OnDestroyed(object sender, EventArgs args) { previousRenderer.Destroyed -= OnDestroyed; previousRenderer.Dispose(); previousRenderer = null; } if (previousRenderer != null) { previousRenderer.Destroyed += OnDestroyed; } Profile.FrameEnd(); }
protected virtual void SwitchFragment(FragmentManager manager, AView targetView, ShellItem newItem, bool animate = true) { var previousView = _currentView; _currentView = CreateShellItemRenderer(newItem); _currentView.ShellItem = newItem; var fragment = _currentView.Fragment; FragmentTransaction transaction = manager.BeginTransactionEx(); if (animate) { transaction.SetTransitionEx((int)global::Android.App.FragmentTransit.FragmentOpen); } transaction.ReplaceEx(_frameLayout.Id, fragment); // Don't force the commit if this is our first load if (previousView == null) { transaction .SetReorderingAllowedEx(true); } transaction.CommitAllowingStateLossEx(); void OnDestroyed(object sender, EventArgs args) { previousView.Destroyed -= OnDestroyed; previousView.Dispose(); previousView = null; } if (previousView != null) { previousView.Destroyed += OnDestroyed; } }
protected async void SetCurrentShellItemController(IShellItemRenderer value) { var oldRenderer = _currentShellItemRenderer; var newRenderer = value; _currentShellItemRenderer = value; AddChildViewController(newRenderer.ViewController); View.AddSubview(newRenderer.ViewController.View); View.SendSubviewToBack(newRenderer.ViewController.View); newRenderer.ViewController.View.Frame = View.Bounds; if (oldRenderer != null) { var transition = CreateShellItemTransition(); await transition.Transition(oldRenderer, newRenderer); oldRenderer.ViewController.RemoveFromParentViewController(); oldRenderer.ViewController.View.RemoveFromSuperview(); oldRenderer.Dispose(); } }
protected virtual void Dispose(bool disposing) { if (_disposed) { return; } _disposed = true; if (disposing) { if (_currentRenderer != null && _currentRenderer.Fragment.IsAlive()) { FragmentTransaction transaction = FragmentManager.BeginTransaction(); transaction.RemoveEx(_currentRenderer.Fragment); transaction.CommitAllowingStateLossEx(); FragmentManager.ExecutePendingTransactionsEx(); } Element.PropertyChanged -= OnElementPropertyChanged; Element.SizeChanged -= OnElementSizeChanged; ((IShellController)Element).RemoveAppearanceObserver(this); // This cast is necessary because IShellFlyoutRenderer doesn't implement IDisposable (_flyoutRenderer as IDisposable)?.Dispose(); _currentRenderer.Dispose(); _currentRenderer = null; } Element = null; // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below. // TODO: set large fields to null. _disposed = true; }