zoukankan      html  css  js  c++  java
  • Xamarin.Forms之布局压缩

    布局压缩

    布局压缩会从视觉树中删除指定的布局,以提高页面渲染性能,以下介绍如何启用布局压缩及其带来的好处。

    Xamarin.Forms使用以下两个递归方法调用来执行布局:

    • 布局以页面的形式在视觉树的顶部开始,并且贯穿视觉树的所有分支以涵盖页面上的每个视觉元素,作为其他元素的父元素的元素负责确定孩子相对于自己的大小和位置。
    • 无效是页面上元素的更改触发新的布局周期的过程,当元素的大小或位置不再正确时,它们将被视为无效。每当其子级中的一个元素更改大小时,可视树中具有子级的每个元素都会收到警报。因此,可视化树中元素大小的更改可能会导致更改,从而在树上起伏不定。

    有关Xamarin.Forms如何执行布局的更多信息,请参见创建自定义布局

    布局过程的结果是本机控件的层次结构。但是,此层次结构包括其他容器渲染器和平台渲染器的包装,进一步扩大了视图层次结构的嵌套。嵌套的层次越深,Xamarin.Forms显示页面所要做的工作就越多。对于复杂的布局,视图层次可以很深也可以很宽,并具有多层嵌套。

    例如,考虑示例应用程序中用于登录Facebook的以下按钮:

    创建自定义布局

    Xamarin.Forms定义了五个布局类-StackLayout,AbsoluteLayout,RelativeLayout,Grid和FlexLayout,并且每个类以不同的方式排列其子级。但是,有时有必要使用Xamarin.Forms未提供的布局来组织页面内容。本文介绍了如何编写自定义布局类,并演示了对方向敏感的WrapLayout类,该类在页面上水平排列其子级,然后将后续子级的显示包装到其他行中。

    在Xamarin.Forms中,所有布局类均从Layout<T>类派生,并将泛型限制为View及其派生类型。反过来,Layout<T>类从Layout类派生,该类提供用于定位和调整子元素大小的机制。

    每个视觉元素负责确定其自己的首选大小,这就是请求的大小。 Page,Layout和Layout <View>派生类型负责确定其子代或相对于其子代的位置和大小。因此,布局涉及父子关系,在这种关系中,父级确定其子级的大小,但将尝试适应请求的子级大小。

    创建自定义布局需要对Xamarin.Forms布局和无效周期有透彻的了解。

    Layout

    布局以页面的形式在视觉树的顶部开始,并且贯穿视觉树的所有分支以涵盖页面上的每个视觉元素,作为其他元素的父元素的元素负责确定孩子相对于自己的大小和位置。

    VisualElement类定义了一个用于测量元素以进行布局操作的Measure方法,以及一个Layout方法,该方法指定了将在其中渲染元素的矩形区域。当应用程序启动并显示第一页时,在Page对象上开始一个布局周期,该周期首先由Measure调用,然后是Layout调用组成:

    • 在布局周期中,每个父元素负责对其子元素调用Measure方法。
    • 在测量完子项之后,每个父元素都有责任在其子项上调用Layout方法。

    此循环确保页面上的每个可视元素都收到对Measure和Layout方法的调用。下图显示了该过程:

    注:如果某些更改影响布局,则布局循环也可能会在视觉树的子集上发生。 这包括从集合中添加或删除的项目,例如StackLayout中的元素,元素的IsVisible属性的更改或元素的大小的更改

    每个具有Content或Children属性的Xamarin.Forms类都有一个可重写的LayoutChildren方法。从Layout<View>派生的自定义布局类必须重写此方法,并确保在元素的所有子元素上调用Measure和Layout方法,以提供所需的自定义布局。

    此外,每个从Layout或Layout<View>派生的类都必须重写OnMeasure方法,这是布局类通过调用其子项的Measure方法来确定其所需大小的地方。

    注:元素根据约束条件确定其大小,约束条件指示元素父元素中元素的可用空间。 传递给Measure和OnMeasure方法的约束范围可以从0到Double.PositiveInfinity。 当元素收到带有非无限自变量的Measure方法的调用时,该元素将受到约束或完全受约束-元素被约束为特定大小。 当一个元素收到其Measure方法的调用时,该元素具有至少一个等于Double.PositiveInfinity的参数,则该元素不受约束或部分受约束–无限约束可被视为指示自动调整大小。

    Invalidation无效

    无效是页面上元素的更改触发新的布局周期的过程,当元素的大小或位置不再正确时,它们将被视为无效。例如,如果Button的FontSize属性发生更改,则认为Button无效,因为它将不再具有正确的大小。调整按钮的大小可能会对整个页面其余部分的布局变化产生连锁反应

    元素通常通过调用InvalidateMeasure方法来使自身无效,通常是在元素的属性发生更改(可能导致元素的新大小)时。此方法将触发MeasureInvalidated事件,该事件由元素的父级处理以触发新的布局周期。

    Layout类在添加到其Content属性或Children集合的每个子对象上为MeasureInvalidated事件设置处理程序,并在删除子对象时分离该处理程序。因此,每当其子级中的一个元素更改大小时,可视树中具有子级的每个元素都会收到警报。下图说明了可视化树中元素大小的更改如何导致更改,从而使树形波动:

    但是,Layout类试图限制孩子的尺寸变化对页面布局的影响。如果布局受大小限制,则子大小的更改不会影响比可视树中父布局高的任何内容。但是,通常布局尺寸的改变会影响布局如何布置其子级。因此,布局大小的任何更改都将启动该布局的布局周期,并且该布局将接收对其OnMeasure和LayoutChildren方法的调用。

    Layout类还定义了一个InvalidateLayout方法,该方法的目的与InvalidateMeasure方法相似。每当进行更改以影响布局的位置和子元素大小时,均应调用InvalidateLayout方法。例如,每当将子级添加到布局或从布局中删除子级时,Layout类都会调用InvalidateLayout方法。

    可以重写InvalidateLayout来实现高速缓存,以最大程度地减少对布局子级的Measure方法的重复调用。覆盖InvalidateLayout方法将提供有关何时向布局添加或删除子项的通知。类似地,当布局的子项之一更改大小时,可以重写OnChildMeasureInvalidated方法以提供通知。对于这两种方法覆盖,自定义布局应通过清除缓存来响应。有关更多信息,请参见计算和缓存数据。

  • 相关阅读:
    scikit-learn与数据预处理
    TensorFlow2.0(11):tf.keras建模三部曲
    机器学习回顾篇(11):支持向量机(SVM)
    机器学习回顾篇(10):感知机模型
    TensorFlow2.0(10):加载自定义图片数据集到Dataset
    机器学习回顾篇(9):K-means聚类算法
    FRP代理及其在数据库安全上的实践
    Elasticsearch系列---实战零停机重建索引
    Elasticsearch系列---索引管理
    Elasticsearch系列---搜索执行过程及scroll游标查询
  • 原文地址:https://www.cnblogs.com/peterYong/p/11972217.html
Copyright © 2011-2022 走看看