姿式摆好,一招学会android的布局优化!

做为android应用来说,不管应用自己多么美观,功能多么强大,内容多么丰富。但若是App自己打开界面缓慢超过手机16ms刷新一次页面的时间,就会产生卡顿。用户体验都会变得极差,致使用户量减小。因此咱们在开发过程当中一样要注重布局优化。react

标签

在Layout布局中若是有你想要引用的布局时,若该布局在不一样的布局是公共布局,咱们会屡次使用到。这时可使用标签。而且便于统一的修改与查看。android

<-- container为引用布局的布局id -->
    <include layout="@layout/container"/>
复制代码

很是简单只要在你所须要放置该布局的布局内部使用标签引入该布局就能够了。 在标签当中,咱们是能够覆写全部layout属性的,即include中指定的layout属性将会覆盖掉。如咱们想修改它的宽高为wrap_content。面试

<include  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        layout="@layout/container" />  
复制代码

除了layout_width与layout_height以外,咱们还能够覆写container中的任何一个layout属性,如layout_gravity、layout_margin等,而非layout属性则没法在标签当中进行覆写。另外须要注意的是,若是咱们想要在标签当中覆写layout属性,必需要将layout_width和layout_height这两个属性也进行覆写,不然覆写效果将不会生效。小程序

标签

标签是做为标签的一种辅助扩展来使用的,它的主要做用是为了防止在引用布局文件时产生多余的布局嵌套。Android解析和展现一个布局须要消耗时间,布局嵌套的越多,那么解析起来也就越耗时,性能也就越差,所以咱们在编写布局文件时应该让嵌套的层数越少越好。react-native

<merge  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content" >
        <View  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"/>
        <View  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"/>
    </merge>

复制代码

你们能够见到标签的使用方法是直接当作该布局的根布局节点使用,而当在其余位置须要引用该布局时,则使用标签进行引用,同时该节点会同步变成父容器的根节点。好比你使用在LinearLayout中则两个view线性排列,而在RelativeLayout中则标签就至关于相对布局标签。这样就能够省略一些没必要要的布局嵌套了。bash

标签

标签其实是一个轻量级的View,它既没有尺寸,也不会绘制任何东西,因此将它放置在布局当中基本能够认为是彻底不会影响性能的。只要在须要的时候显示它,才会进行加载。网络

<ViewStub
    android:id="@+id/stub"
    android:inflatedId="@+id/container_layout"
    android:layout="@layout/stub_layout"
    android:layout_width=",match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom" />
复制代码

虽然ViewStub是不占用任何空间的,可是每一个布局都必需要指定layout_width和layout_height属性,不然运行就会报错。且ViewStub所要替代的layout文件中不能含有标签,因此使用前须要构思好界面布局,以避免没必要要的嵌套。一旦ViewStub被显示后,则ViewStub将从视图框架中移除,其id也会失效,此时findViewById()获得的也是空的。框架

ViewStub使用起来很是简单,只要在须要的时候findViewById()招到它并调用setVisibility(View.VISIBLE)或者inflate()显示它就能够了。工具

标签小结

标签 使用缘由 优化结果 使用举例
提取公共部分,提升布局复用性 减小测量,绘制时间 App中有多个UI界面须要使用同一布局或部分布局时。如页面标题toolBar复用时使用。
布局层级减小 减小绘制工做量 当所须要复用的部分布局与要合并到的布局的根标签一致时使用。(相似增强版include,减小布局层级,但耦合性更强)。
无需第一时间展现于界面上,在须要时加载 减小测量,绘制时间 该界面不须要第一时间展现给用户,如网络报错界面,或用户信息下拉界面,在该界面中,但第一时间不须要显示给用户时使用。

ConstraintLayout约束布局

AndroidStudio上有一个神奇的功能,就是在Xml布局中咱们能够在design标签下进行布局可视化操做。可是该功能并不完善,属于系统自动生成的一个布局,反而会让布局内部凌乱不堪,难以读懂,同时会形成卡顿,因此之前咱们都是用该界面进行预览查看;而ConstraintLayout约束布局这一新布局,它反而支持布局可视化操做,能够把它比喻成一个可视化视图操做布局的RelativeLayout,ConstraintLayout是使用约束的方式来指定各个控件的位置和关系的。布局内部不须要嵌套其余布局,就能够完成你想要的界面出现。因此它能够有效的避免布局的嵌套,从而达到优化布局的效果。由于使用太过复杂,想要深刻了解使用方法请点击ConstraintLayout布局

减小视图树层级结构

系统在显示没一个视图的时候,都要经理测量,布局,绘制的过程。若是咱们的布局嵌套层数太多,会致使额外的测量、布局等,十分消耗系统资源,使UI卡顿,影响用户体验。因此要尽可能减小是图书层级结构,避免没必要要的布局嵌套,使用更少嵌套的布局方式。

查看文件的视图树,咱们可使用DDMS来查看。首先运行项目在真机或虚拟机上。然后再到tools中打开DDMS。这里就不展开介绍了。

其余

  • 嵌套的LinearLayout中,尽可能不要使用weight,由于weight会从新测量两次。
  • Layout的选择,以尽可能减小View树的层级为主,去除没必要要的嵌套和View节点。好比若是LinearLayout嵌套过多,建议使用RelativeLayout减小布局嵌套。
  • RelativeLayout自己尽可能不要嵌套使用。
  • View视图的隐藏与现实,尽可能使用invisible。由于gone,不占用空间,视图会从新测量绘制;而invisible视图不会从新绘制,但仍然占用空间位置。
  • 布局调优工具:hierarchy viewerLint tool

连接:https://www.jianshu.com/p/faf57bd030ee

阅读更多

react-native技术的优劣*

学习React Native必看的几个开源项目

开发了几个小程序后,说说我对小程序的见解

NDK项目实战—高仿360手机助手之卸载监听

(Android)面试题级答案(精选版)

技术+职场
相关文章
相关标签/搜索