Android 复杂的基于RelativeLayout的视图-性能问题

Android 复杂的基于RelativeLayout的视图-性能问题,android,android-relativelayout,Android,Android Relativelayout,使用大量嵌套RelativeLayout时出现性能问题。 例如,如果我们有一些RelativeLayout作为UI根,并且每个容器(按钮、标签、textview、imageview)都是一个RelativeLayout+基于Android的组件(例如aButton=RelativeLayout+imageview+textview),那么在一个包含4个按钮、3个图像和6个标签的复杂视图中,我们会得到约15个嵌套的RelativeLayout。 RelativeLayout有一个非常复杂的onMe

使用大量嵌套RelativeLayout时出现性能问题。

例如,如果我们有一些RelativeLayout作为UI根,并且每个容器(按钮、标签、textview、imageview)都是一个RelativeLayout+基于Android的组件(例如aButton=RelativeLayout+imageview+textview),那么在一个包含4个按钮、3个图像和6个标签的复杂视图中,我们会得到约15个嵌套的RelativeLayout。

RelativeLayout有一个非常复杂的onMeasure方法,它计算每个子级的大小以确定布局的大小。计算15-20嵌套RelativeLayouts的复杂视图的大小需要约5秒,这太多了。onMeasure是所有调用中最昂贵的,甚至绘图完成的速度也比measure快得多。
为了避免出现使用本机android视图构建复杂内容的建议:
需要能够将所有内容添加到所有内容中。这就是为什么每个容器不仅必须是视图,而且必须是视图组。而相对论的特性,如重力和对齐也能起到很大的作用,这就是为什么要使用大量的相对论。

有人遇到过这些性能问题吗?
用其他布局替换RelativeLayout是否可以解决问题?
或者删除所有这些嵌套布局是解决此问题的唯一方法?

有人知道在不出现性能问题的情况下可以嵌套多少布局吗?

这完全取决于您的测试设备。但是您应该检查
层次结构查看器
(在工具目录中)是否有不必要的视图嵌套,以便删除它们

此外,您的aButton听起来像股票
ImageButton
。所以你至少可以用标准溶液来代替它


如果您发布了一些代码,则可能更容易判断是否有更多的项可由库存解决方案替代。

经过几次测试后得出结论,拥有超过12个嵌套布局对性能有很大影响。
平均10-11个嵌套布局应该可以正常工作。

例如,在设备上6秒钟内,12个嵌套布局,每个显示器上有12个子项,在emulator上有9个子项。

我的理解是,relativelayout的全部要点是,您不必将它们嵌套到第n级。为什么不只使用几个RelativeLayout,而不是每个组件使用一个?

错误提示了我的aButton版本。aButton=RelativeLayout+ImageButton+TextView(用于标签支持)。我检查了HierarchyViewer,一切看起来都很好。当然,我可以去掉一些布局,但它不会增加平均性能。我得到的不是视图出现前的6秒,而是~4秒。还是太麻烦了,所以你可以使用一个带有
android:background=“@color/transparent”
标签的简单按钮来使按钮本身透明,然后使用
android:drawableTop=“@drawable/some_drawable”
在按钮本身中绘制图像。是的,这是一个简化按钮的解决方案。我还可以创建自己的类someButton扩展ImageButton,并在onDraw()方法中绘制标签,而无需使用TextView。在这种情况下,也不再需要RelativeLayout。但是,首先我想确定,出于某种原因,使用N个嵌套RelativeLayouts是错误的。在那之后,我将开始简化组件并重写我的应用程序的UI架构。一般来说,使用较少的布局会更好,但你不应该放弃屏幕设计。此外,您应该尝试使用系统本身提供的布局,即按钮,而不是RelativeLayout中的ImageButton和TextView,以加快布局过程。布局元素越多,加载它们所需的时间就越长。@Jitsu:已经读取了吗?它可以帮助您。您是如何测量延迟的?使用调试方法和内置的traceview实用程序。你可以在这里得到更多的细节