优化自己的app布局做法如下:
拿起你的手机打开设置----开发者选项---调试GPU过度绘制---显示过度绘制区域,打开你的app
蓝色:一次绘制
绿色:两次绘制
淡红:三次绘制
深红:四次绘制
1.背景重叠的太多。 在我们的布局中你添加一层布局改变的只是布局的逻辑,没有重新绘制,当设置了背景就会重新绘制一下.当绘制了四次的时候就出现了大红色了,所以尽管有的时候重复的背景不可避免,但是要尽量避免过度绘制。
2.View 叠加的太多或者Layout层级太过复杂,在开发中Fragment药尽量使用show显示,布局中学会使用ViewStub 、merge 、include
include使用:
项目中往往有很多布局是重复的,那么我们可以把这个布局抽取出来,写成单独的xml,在需要使用这个重复的布局时候,使用include直接导入就可以。直接上代码,<include layout="@layout/mytitlebar"/> ,我们也可以给这个include标签加任何属性,前提是要给他设置了宽高属性。这样代码就简单明了了很多。
merge使用:
这个标签对于我们整理布局结构有很大的作用,他可以删除多余的层级,避免层级太多,当LayoutInflater遇到这个标签时,它会跳过它,并将<merge />内的元素添加到<merge />的父元素里, 比如你的根布局是LinearLayout,恰好你在根布局里边添加的view用也用LinearLayout包裹着,那么根布局里边的这个LinearLayout就可以用merge代替了。这样就减少了一个布局层级。Activity setContentView添加的顶层视图是FrameLayout,所以说merge经常用来代替FrameLayout,注意:
<merge />标签极其有用。然而它也有以下两个限制:
· <merge />只能作为XML布局的根标签使用
· 当Inflate以<merge />开头的布局文件时,必须指定一个父ViewGroup,并且必须设定attachToRoot为true(参看inflate(int, android.view.ViewGroup, Boolean)方法)。
ViewStub使用:
ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件,他的优点是当需要使用它的时候才加载,比如加载错误提示的布局等等,是不常用的布局,那么就可以使用viewstub..ViewStub之所以常称之为“延迟化加载”,是因为在教多数情况下,程序无需显示ViewStub所指向的布局文件,只有在特定的某些较少条件下,此时ViewStub所指向的布局文件才需要被inflate,且此布局文件直接将当前ViewStub替换掉,具体是通过viewStub.infalte()或viewStub.setVisibility(View.VISIBLE)来完成.
首先来说说ViewStub的一些特点:
1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。
基于以上的特点,那么可以考虑使用ViewStub的情况有:
1. 在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。
因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。
2. 想要控制显示与隐藏的是一个布局文件,而非某个View。
因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。
所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。
下面来看一个实例
在这个例子中,要显示二种不同的布局,一个是用TextView显示一段文字,另一个则是用ImageView显示一个图片。这二个是在onCreate()时决定是显示哪一个,这里就是应用ViewStub的最佳地点。