protected virtual void OnChildAdded(VisualElement view) { if (_isDisposed) { return; } var reference = Guid.NewGuid().ToString(); Performance.Start(reference); if (CompressedLayout.GetIsHeadless(view)) { var packager = new VisualElementPackager(Renderer, view); view.IsPlatformEnabled = true; packager.Load(); } else { var viewRenderer = Platform.CreateRenderer(view); Platform.SetRenderer(view, viewRenderer); var uiview = Renderer.NativeView; uiview.AddSubview(viewRenderer.NativeView); if (Renderer.ViewController != null && viewRenderer.ViewController != null) { Renderer.ViewController.AddChildViewController(viewRenderer.ViewController); } EnsureChildrenOrder(); } Performance.Stop(reference); }
void AddChild(VisualElement view, IVisualElementRenderer oldRenderer = null, RendererPool pool = null, bool sameChildren = false) { var reference = Guid.NewGuid().ToString(); Performance.Start(reference); if (CompressedLayout.GetIsHeadless(view)) { var packager = new VisualElementPackager(_renderer, view); if (_childPackagers == null) { _childPackagers = new Dictionary <BindableObject, VisualElementPackager>(); } view.IsPlatformEnabled = true; packager.Load(); _childPackagers[view] = packager; } else { if (_childViews == null) { _childViews = new List <IVisualElementRenderer>(); } IVisualElementRenderer renderer = oldRenderer; if (pool != null) { renderer = pool.GetFreeRenderer(view); } if (renderer == null) { Performance.Start(reference, "New renderer"); renderer = Platform.CreateRenderer(view, _renderer.View.Context); Performance.Stop(reference, "New renderer"); } if (renderer == oldRenderer) { Platform.SetRenderer(renderer.Element, null); renderer.SetElement(view); } Performance.Start(reference, "Set renderer"); Platform.SetRenderer(view, renderer); Performance.Stop(reference, "Set renderer"); Performance.Start(reference, "Add view"); if (!sameChildren) { (_renderer.View as ViewGroup)?.AddView(renderer.View); _childViews.Add(renderer); } Performance.Stop(reference, "Add view"); Performance.Stop(reference); } }
void AddChild(VisualElement view, IVisualElementRenderer oldRenderer = null, RendererPool pool = null, bool sameChildren = false) { Performance.Start(); if (CompressedLayout.GetIsHeadless(view)) { var packager = new VisualElementPackager(_renderer, view); view.IsPlatformEnabled = true; packager.Load(); } else { if (_childViews == null) { _childViews = new List <IVisualElementRenderer>(); } IVisualElementRenderer renderer = oldRenderer; if (pool != null) { renderer = pool.GetFreeRenderer(view); } if (renderer == null) { Performance.Start("New renderer"); renderer = Platform.CreateRenderer(view); Performance.Stop("New renderer"); } if (renderer == oldRenderer) { Platform.SetRenderer(renderer.Element, null); renderer.SetElement(view); } Performance.Start("Set renderer"); Platform.SetRenderer(view, renderer); Performance.Stop("Set renderer"); Performance.Start("Add view"); if (!sameChildren) { (_renderer.View as ViewGroup)?.AddView(renderer.View); _childViews.Add(renderer); } Performance.Stop("Add view"); } Performance.Stop(); }
static double ComputeAbsoluteY(VisualElement e) { var parentY = 0.0; if (e.RealParent is VisualElement ve) { if (CompressedLayout.GetIsHeadless(e.RealParent)) { parentY = ComputeAbsoluteY(ve); } else { parentY = Forms.ConvertToScaledDP(Platform.GetRenderer(e.RealParent).GetNativeContentGeometry().Y); } } return(e.Y + parentY); }
static void UpdateLayout(IEnumerable <Element> children) { foreach (Element element in children) { var visualElement = element as VisualElement; if (visualElement == null) { continue; } IVisualElementRenderer renderer = AppCompat.Platform.GetRenderer(visualElement); if (renderer == null && CompressedLayout.GetIsHeadless(visualElement)) { UpdateLayout(visualElement.LogicalChildren); } renderer?.UpdateLayout(); } }
protected virtual void AddHeadlessChild(VisualElement element, IContainable <EvasObject> parent) { foreach (var child in (element as IVisualTreeElement).GetVisualChildren()) { if (child is VisualElement visualChild) { if (CompressedLayout.GetIsHeadless(visualChild)) { AddHeadlessChild(visualChild, parent); visualChild.IsPlatformEnabled = true; } else { var childRenderer = Platform.GetOrCreateRenderer(visualChild); parent.Children.Add(childRenderer.NativeView); } } } }
/// <summary> /// Adds a new child if it's derived from the VisualElement class. Otherwise this method does nothing. /// </summary> /// <param name="child">Child to be added.</param> protected virtual void AddChild(Element child) { if (child is VisualElement ve) { if (CompressedLayout.GetIsHeadless(ve) && NativeView is IContainable <EvasObject> containerNativeView) { AddHeadlessChild(ve, containerNativeView); ve.IsPlatformEnabled = true; } else { var childRenderer = Platform.GetOrCreateRenderer(ve); // if the native view can have children, attach the new child if (NativeView is IContainable <EvasObject> containerView) { containerView.Children.Add(childRenderer.NativeView); } } } }
void FillChildrenWithRenderers(VisualElement element) { foreach (var logicalChild in ((IElementController)element).LogicalChildren) { var child = logicalChild as VisualElement; if (child != null) { if (CompressedLayout.GetIsHeadless(child)) { child.IsPlatformEnabled = true; FillChildrenWithRenderers(child); } else { var renderer = GetFreeRenderer(child) ?? Platform.CreateRenderer(child); Platform.SetRenderer(child, renderer); _parent.NativeView.AddSubview(renderer.NativeView); } } } }
static double ComputeAbsoluteY(VisualElement e) { var parentY = 0.0; if (e.RealParent is VisualElement parent) { if (CompressedLayout.GetIsHeadless(e.RealParent)) { parentY = ComputeAbsoluteY(parent); } else { if (parent.Handler is IPlatformViewHandler nativeHandler) { parentY = nativeHandler.GetPlatformContentGeometry().Y.ToScaledDP(); } else { parentY = Forms.ConvertToScaledDP(Platform.GetRenderer(e.RealParent).GetNativeContentGeometry().Y); } } } return(e.Y + parentY); }