【问题标题】:Display performance with relativeLayout containing a lot of TextView包含大量 TextView 的 relativeLayout 的显示性能
【发布时间】:2011-11-18 18:19:10
【问题描述】:

我在使用包含 153 个 TextView 的 RelativeLayout(包装在 ScrollView 中)时遇到性能问题。每个 TextView 都有 9 个补丁背景。

主要布局:

<ScrollView 
    android:id="@+id/forum_accueil_ScrollView"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:background="@color/white">
    <RelativeLayout android:id="@+id/forum_accueil_RelativeLayout"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:background="@color/white">
    </RelativeLayout>
</ScrollView>

RelativeLayout 以编程方式填充了 TextView(项目计数和描述来自 WS)。每个 TextView 都有一个 9patch 背景选择器。 TextView 说明如下:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="35dip"
    android:textColor="@color/myblue"
    android:textStyle="bold"
    android:gravity="center_vertical" android:layout_gravity="center_vertical"
    android:background="@drawable/selector_forum_accueil_item">
</TextView>

最后,我有一个包含 153 个 TextView 的 RelativeLayout。显示和滚动真的很慢。即使重新开始这项活动也需要一些时间。

我打开了层次结构查看器,滚动视图需要以下时间才能显示:

测量:28 毫秒 布局:1.2ms 绘制:18ms

有没有办法加快显示和响应速度?包含尽可能多的 View 的单个 RelativeLayout 是否是最好的方法(我试图用这种技术尽可能地扁平化层次结构)? 我尝试删除 9 补丁背景进行测试,它似乎响应更快。为什么?

【问题讨论】:

  • 速度很慢,因为您绘制了 153 次视图!适配器的优点在于它们只绘制当时需要的东西。您正在绘制您的所有视图,此时绝大多数都没有被查看。

标签: android android-layout


【解决方案1】:

这是大量的 TextView。此时使用 ListView。您的 RelativeLayout 为您(在这种情况下)做了哪些 ListView 不能做的事情?

【讨论】:

  • 我需要允许用户使用触摸和轨迹球来导航扔掉所有这些 TextView,我担心带有单元格的 ListView 不允许我让它完全一样地工作。
  • 这是列表视图的重点。列出大量相似的项目。
  • 是的,但它可以完全充当相对布局吗?它可以将导航作为 ScrollView 中的 RelativeLayout 处理吗?在 touchMode 下,我想我可以做到,但 tackball 不确定...
  • 你是什么意思:'它可以将导航作为 ScrollView 中的 RelativeLayout' 来处理吗?使用轨迹球,当您向下滚动时,它将选择列表中的下一项。
  • 让我问一个更好的问题。您如何在 RelativeLayout 中组织这些视图?您是通过一个循环逐步完成并仅将下一个视图添加到 RL,还是您手动完成并将每个视图单独添加到其自己的独特位置?你对这些值得 RL 的观点做了什么?
【解决方案2】:

您的问题很清楚:为什么在去掉 9-patch 背景后渲染/布局时间的响应速度会这么快?实际上有两个很好的答案:

  1. 指定背景属性与使用包含背景属性的样式相比要慢得多。样式与 GPU 一起缓存,因此它已经知道背景并使用它。如果您不指定样式,则无论如何都会使用样式(默认样式),并且它确实包含某种背景,这是首先应用的。然后应用特定于视图的属性,即重新渲染您指定的背景。
  2. 9 补丁图像可能需要 更多 更长的时间来渲染。再加上您要求将其渲染 153 次,性能将呈指数级下降。我现在正在查看一个案例,我看到“常规”.png 位图在 1.5 毫秒内呈现,而在相同布局中非常简单的 9-patch 在 45 毫秒时慢了 30 倍。

警告:9-patch 渲染经常,但并非总是受到占渲染时间 80% 的 GC 周期的影响。在某些情况下,我看到在渲染其他位图/光栅图像时会发生此 GC 循环,但它确实似乎在 9-patch 渲染期间发生得更频繁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2015-12-15
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多