public void Show(ToastView view, object viewModel = null) { if (viewModel != null) { view.BindingContext = viewModel; } view.Parent = Application.Current.MainPage; var renderer = Dialogs.CreateNativeView(view); var measure = Dialogs.Measure(view); renderer.SetElementSize(measure); renderer.NativeView.Alpha = 0; if (view.CornerRadius > 0) { renderer.NativeView.Layer.CornerRadius = view.CornerRadius; renderer.NativeView.Layer.MasksToBounds = true; } if (view.BorderWidth > 0) { renderer.NativeView.Layer.BorderWidth = (float)view.BorderWidth; renderer.NativeView.Layer.BorderColor = view.BorderColor.ToCGColor(); } SetView(view, renderer.NativeView, renderer); view.Parent = null; view.RunPresentationAnimation(); UIView.Animate( 0.25, () => renderer.NativeView.Alpha = (System.nfloat)view.Opacity ); Device.StartTimer(TimeSpan.FromMilliseconds(Math.Max(view.Duration - 250, 0)), () => { view.RunDismissalAnimation(); UIView.Animate( 0.25, () => renderer.NativeView.Alpha = 0, () => { view.Parent = null; renderer.NativeView.RemoveConstraints(renderer.NativeView.Constraints); Dialogs.DisposeModelAndChildrenRenderers(view); renderer = null; view.Destroy(); view.BindingContext = null; view = null; } ); return(false); }); }
public void Show(ToastView view, object viewModel = null) { view.Parent = XF.Application.Current.MainPage; view.BindingContext = viewModel; var toast = new Android.Widget.Toast(Dialogs.Context); var offsetX = (int)Dialogs.Context.ToPixels(view.OffsetX); var offsetY = (int)Dialogs.Context.ToPixels(view.OffsetY); // HACK: For some reason, the offset direction is reversed when GravityFlags contains Left or Bottom. if (view.HorizontalLayoutAlignment == XF.LayoutAlignment.End) { offsetX *= -1; } if (view.VerticalLayoutAlignment == XF.LayoutAlignment.End) { offsetY *= -1; } toast.SetGravity(Dialogs.GetGravity(view), offsetX, offsetY); toast.Duration = Android.Widget.ToastLength.Long; var renderer = Dialogs.CreateNativeView(view); var measure = Dialogs.Measure(view); view.Layout(new XF.Rectangle(new XF.Point(0, 0), measure)); var realW = (int)Dialogs.Context.ToPixels(measure.Width); var realH = (int)Dialogs.Context.ToPixels(measure.Height); var layout = new LinearLayout(Dialogs.Context); using (var param = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent) { Width = realW, Height = realH }){ layout.LayoutParameters = param; } using (var param = new LinearLayout.LayoutParams(realW, realH) { Width = realW, Height = realH }){ layout.AddView(renderer.View, param); } if (view.CornerRadius > 0) { var border = new GradientDrawable(); border.SetCornerRadius(Dialogs.Context.ToPixels(view.CornerRadius)); if (!view.BackgroundColor.IsDefault) { border.SetColor(view.BackgroundColor.ToAndroid()); border.Alpha = (int)(view.Opacity * 255); } layout.ClipToOutline = true; layout.SetBackground(border); } toast.View = layout; view.RunPresentationAnimation(); toast.Show(); var duration = Math.Max(Math.Min(view.Duration - 260, 3500), 0); // give a bit millisecond margin var handler = new Handler(); handler.PostDelayed(new Runnable(view.RunDismissalAnimation), duration); handler.PostDelayed(new Runnable(() => { //view.RunDismissalAnimation(); //await Task.Delay(250); toast?.Cancel(); view.Parent = null; if (!renderer.View.IsDisposed()) { renderer.View.RemoveFromParent(); renderer.View.Dispose(); } layout.Dispose(); // I coudn't reproduce https://github.com/muak/AiForms.Dialogs/issues/2. // But I let this code disabled because it has no influent even if it is disabled. //toast.View = null; renderer.Dispose(); renderer = null; toast?.Dispose(); toast = null; view.Destroy(); view.BindingContext = null; }), view.Duration); }