android性能优化之布局优化

布局选择概述

对于界面优化,需要考虑的主要有两点,测量次数以及过度绘制的问题,这个需要考虑的就是所需选用的布局,所选的布局不同,会直接影响到子布局的绘制次数,下面以常用布局为例,一般情况下:LinearLayout和FrameLayout的子view都是测量一次的,其中LinearLayout有个特殊的情况,就是如果他的子view设置weight属性,这时LinearLayout的子view是会测量两次的,对于RelativeLayout和ConstraintLayout布局,子view都是需要测量两次的,从测量次数来看,优先选用的是LinearLayout和FrameLayout,如果view在界面上是没有位置关系的,优先选用的是FrameLayout,这里说的只是从测量次数来看,如果布局比较复杂的时候,使用LinearLayout和FrameLayout会增加布局层级,这时候就可以
视情况改为使用RelativeLayout和ConstraintLayout了,这里需要注意,RelativeLayout和ConstraintLayout最好不要嵌套或交叉嵌套使用,如果嵌套使用,子view的测量次数是呈指数增长的(子view测量两次的都不要交叉使用)。

view使用注意点

1、WebView使用的时候需要注意,第一次初始化是相对比较费时,所以有使用WebView的时候,应该提前去初始化,在主线程中合适的地方调用:

        Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
            @Override
            public boolean queueIdle() {
                WebView webView = new WebView(getApplicationContext());
                return false;
            }
        });

这样下次使用WebView的时候就会相对快些。

2、设置界面背景时,不建议直接在view的xml布局中去设置,这样设置会导致过度绘制,为什么会导致过度绘制呢?在布局文件中,最顶层的View其实的DecorView,它是在PhoneWindow中创建的,并且会去获取主题中windowBackground设置的值,将其设置为DecorView的背景,这时再在其子布局中去设置背景,就会导致过度绘制,如何能避免这个问题呢?有两种方案:一是将对应Activity的主题属性windowBackground设置为null,二是在view绘制之前,在代码中调用getWindow().setBackgroundDrawable(drawable);

布局重用问题

在开发的过程中,会发现有许多的布局是可以重用的,这时候就可以用到Google提供的include的标签,使用这个标签有一个必填属性:layout,这个就是指定被包裹进来的子布局,当子布局与include的父布局是同一个类型的布局,这时候就可以使用merge标签了,这时候使用merge的好处是可以减少一层布局,达到优化的效果,对于使用merge标签时,可以在include中添加布局参数,这个参数会直接作为include的子布局的根布局参数,使用include时还有一个需要注意的地方,如果include中有设置id,并且include的子布局的根布局中也设置了id,这时include中设置的id会覆盖掉包裹进来的根布局的id。如果对include标签解析感兴趣的,可以去看看LayoutInflater的源码。

你可能感兴趣的:(性能优化,Android)