美文网首页
提高布局性能

提高布局性能

作者: 贝贝beibei96 | 来源:发表于2018-04-30 12:51 被阅读40次

布局是直接影响用户体验的Android应用程序的关键部分。如果实施效果不佳,您的布局会导致内存耗尽与较慢的用户界面。Android SDK包含的工具可帮助您识别布局性能方面的问题,当您将这些经验结合起来使用时,您将能够以最小的内存占用量实现平滑的滚动界面。

1.优化布局层次结构

使用基本布局结构实现最高效的布局是一个常见的误解。但是,添加到应用程序中的每个小部件和布局都需要初始化,布局和绘图。例如,使用嵌套实例LinearLayout可能会导致视图层次过深。此外,嵌套LinearLayout使用layout_weight参数多次实例的代价可能很大,因为每个子布局需要测量两次。当布局反复实例时,这尤其重要,例如在RecyclerView与ListView里面使用时。

使用Hierarchy ViewerLint来检查和优化您的布局。


2.重用布局

虽然Android提供了各种小部件来提供小型且可重用的交互元素,但您可能还需要重新使用需要特殊布局的较大组件。为了有效地重新使用完整的布局,可以使用<include/><merge/>标签在当前布局中嵌入另一个布局。

重复使用布局非常强大,因为它允许您创建可重用的复杂布局。例如,是/否按钮面板,或带有说明文字的自定义进度栏。这也意味着您的应用程序的任何元素都可以在多个布局中提取,分别管理,然后包含在每个布局中。因此,尽管可以通过编写自定义来创建各个UI组件,View通过重新使用布局文件,您可以更轻松地完成任务。

2.1创建一个可重用的布局

如果您已经知道要重新使用的布局,请创建一个新的XML文件并定义布局。例如,以下是定义要包含在每个活动(titlebar.xml)中的标题栏的布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/titlebar_bg"
    tools:showIn="@layout/activity_main" >

    <ImageView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:src="@drawable/gafricalogo" />
</FrameLayout>

根目录`View应完全按照您希望它出现在添加此布局的每个布局中。

注意:tools:showIn上述XML中 的属性是一个特殊属性,在编译期间会被删除,并且仅在Android Studio的设计时使用 - 它指定 包含 此文件的布局,因此您可以在出现该文件时预览(和编辑)该文件同时嵌入父级布局中。

2.2使用<include>标签

在要添加可重用组件的布局中,添加 <include/>标签。例如,这是一个包含上面标题栏的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_bg"
    android:gravity="center_horizontal">

    <include layout="@layout/titlebar"/>

    <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="@string/hello"
              android:padding="10dp" />

    ...

</LinearLayout>

您也可以android:layout_*通过在<include/>标签中指定包含布局的根视图的所有布局参数(任何属性)。例如:

<include android:id="@+id/news_title"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         layout="@layout/title"/>

但是,如果要使用<include>标签覆盖布局属性,则必须覆盖两者 android:layout_height并使android:layout_width其他布局属性生效。

2.3使用<merge>标签

<merge />标签包含在另一个布局中时,该标签有助于消除视图层次结构中的冗余视图组。例如,如果您的主布局是LinearLayout可以在多个布局中重新使用两个连续视图的垂直布局,则放置两个视图的可重用布局需要具有其自己的根视图。但是,使用另一个LinearLayout作为可重用布局的根目录会导致垂直LinearLayout内部出现垂直LinearLayout。嵌套LinearLayout 服务没有真正的目的,除了减慢你的UI性能。

为了避免包含这样的冗余视图组,您可以改为使用该 <merge>元素作为可重用布局的根视图。例如:

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/add"/>

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/delete"/>

</merge>

现在,当您在另一个布局(使用<include/>标签)中包含此布局时,系统将忽略该<merge>元素,并将两个按钮直接放置在布局中,而不是<include/>标签。


3.延迟加载视图

有时您的布局可能需要很少使用的复杂视图。无论它们是项目详细信息,进度指示符还是撤销消息,都可以通过仅在需要时加载视图来减少内存使用量并加快渲染速度。
当您的应用程序将来可能需要复杂视图时,推迟加载资源是一项重要的技术。您可以通过ViewStub为那些复杂且很少使用的视图定义一个实现此技术 。

3.1

ViewStub是一个没有尺寸的轻量视图,不会绘制任何东西或参与布局。因此,膨胀并便宜地离开视图层次结构是便宜的。每个ViewStub只需要包含该android:layout属性来指定要膨胀的布局。
以下ViewStub是一个半透明的进度条覆盖。只有当新项目被导入到应用中时,它才应该可见。

<ViewStub
    android:id="@+id/stub_import"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/progress_overlay"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom" />
3.2加载ViewStub布局

当您想要加载由该指定的布局时ViewStub,通过调用inflate()或调用setVisibility(View.VISIBLE)将其设置为可见。

findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

一旦 visible或者inflatedViewStub元素不再是视图层次结构的一部分。它被inflated的布局取代,并且该布局的根视图的ID是由android:inflatedIdViewStub 的属性指定的。(android:id为此指定的ID ViewStub仅在ViewStub布局visible/inflated之前有效。)

注意:其中一个缺点ViewStub是它目前不支持<merge>标签在布局中inflated

相关文章

  • 提高布局性能

    布局是直接影响用户体验的Android应用程序的关键部分。如果实施效果不佳,您的布局会导致内存耗尽与较慢的用户界面...

  • Android技巧 - 收藏集 - 掘金

    Android 中使用 ViewStub 提高布局性能 - Android - 掘金在 Android 开发中, ...

  • Android 性能优化 相关

    一 布局优化 核心思想:减少布局文件层级布局层级减少 -> 绘制工作量减少 ->性能提高 删除布局中无用控件和层级...

  • Android 优化

    一. 布局优化 核心思想:减少布局文件层级布局层级减少 -> 绘制工作量减少 ->性能提高 删除布局中无用控件和层...

  • 基本性能优化

    布局优化 避免过度绘制嵌套,导致16秒无法完成绘制 使用viewstub提高布局性能 内存优化 避免内存溢出和内存...

  • GridLayout使用要点总结

    GridLayout是在Android4.0中引进的新布局,使用它的理由有两个:1,减少布局嵌套层次从而提高性能;...

  • android性能优化

    android 性能优化主要包含了以下几个方面: 布局优化 绘制优化 避免内存泄漏 提高响应速度 Listview...

  • 布局优化

    一.核心思想 减少布局文件的层次 布局的层次少了,意味着Android绘制时的工作量少了,程序的性能自然就提高了。...

  • 强大的约束布局ConstraintLayout

    1.目录 布局嵌套减少,提高性能,具体可点击跳转查看[https://mp.weixin.qq.com/s/gGR...

  • 从 Auto Layout 的布局算法谈性能

    从 Auto Layout 的布局算法谈性能 从 Auto Layout 的布局算法谈性能

网友评论

      本文标题:提高布局性能

      本文链接:https://www.haomeiwen.com/subject/qrgolftx.html