【问题标题】:Parent view draw child view efficient父视图绘制子视图高效
【发布时间】:2013-01-25 19:09:22
【问题描述】:

例如,顶级 LinearLayout 视图有 300 个子视图。但设备屏幕尺寸仅显示 11 个子视图一次。 android如何计算一次可以显示多少个子视图?视图如何知道它将被绘制?

已编辑
在我的工作中,有这样一个案例: 一个父 LinearLayout 视图可能有数百个子视图。为了更好的性能,我的解决方案是这样的:likelazy load。

  1. List list = new ArrayList();//包含使用构造View对象的实体对象
  2. 默认加载 5 个子视图。
  3. 父 LinearLayout 视图最后一个子视图是自定义加载视图,我已经覆盖了它的 onDraw() 方法。如果加载视图是绘制,这意味着我需要获取下一个 5 子视图(从列表中获取下一个 5 对象,并创建相应的视图)。


我想知道android框架是如何处理这种情况的?

【问题讨论】:

标签: android android-layout view ondraw


【解决方案1】:

您是否在顶级 LinearLayout 视图中使用滚动条并在该布局上添加子视图,这很简单...

【讨论】:

    【解决方案2】:

    一个父 LinearLayout 视图可能有数百个子视图。为了 为了获得更好的性能,我的解决方案是这样的:比如延迟加载。

    LinearLayout 与(可能)数百个子视图有点矛盾更好的性能。我认为您正在寻找的是带有无尽适配器的ListView(一个简单的谷歌搜索将显示如何实现它,而不是那么困难)。一旦您到达最后加载的元素,此适配器将开始加载视图(在加载新内容时显示加载视图)。

    如果您仍想使用LinearLayout

    如果您只是想让LinearLayout 在第一次布局时填充屏幕的内容,您可以在onCreate 方法中的一个视图上发布Runnable(如果这是您将首先填充LinearLayout)。在 Runnable 中找到 LinearLayout 的高度,并将其与当前存在的孩子的组合高度进行比较。如果合并的子高度小于LinearLayout 高度,则添加更多视图以进行补偿。

    如果LinearLayoutScrollView 中,并且您想在加载视图可见时添加其他子级,则监视ScrollView 的滚动,并在加载视图可见时添加新子级。通过检查用户滚动了多少与LinearLayout 的当前存在的子项的组合高度相比,可以查看加载视图何时变得可见。

    初步回复:

    您的问题对于您想知道的内容有点模棱两可。如果你有一个特定的问题,你应该从那个开始。

    例如,顶级 LinearLayout 视图有 300 个子视图。但 设备屏幕尺寸仅显示 11 个子视图一次。

    请不要让自己陷入这种情况。如果您的内存不足(因为所有这些视图都将保存在内存中),那么该数量的视图会导致性能下降甚至应用程序崩溃。

    android如何计算一次可以显示多少个子视图?

    每个ViewViewGroup 都有onMeasure 方法来测量自己及其子项(如果有)。 LinearLayout 将调用其 onMeasure 方法,在此方法中它将测量其子级(使用度量 method)给他们一些关于他们应该有多大的建议(LinearLayout 收到一些关于多大的建议它应该来自其父级)。如果您想了解这是如何完成的,请查看LinearLayout 的源代码。

    视图如何知道它会被绘制?

    我不明白你想知道什么。要在屏幕上绘制视图,将调用其onDraw 方法。

    【讨论】:

    • 谢谢你的回答。我想知道android如何处理这个细节。我看到 LinearLayout 源代码,没有找到计算逻辑。
    • @boiledwater 如果您查看LinearLayout 的源代码,您会在onMeasure 中看到它如何测量它的孩子。只要需要显示/重新显示视图层次结构,系统就会调用onMeasure 回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多