布局优化


优化布局使用


     1>建议使用LinearLayout、RelativeLayout、FrameLayout。


     2>在布局层次一样的前题下,优先使用LinearLayout或者FrameLayout(未分出先后),对同样的布局哪种布局层次最少,就用哪种。


     3>使用LinearLayout的layout_weight时,让其使用方向上的长或者宽为0,因为这样解析会比较快(详见onMeasure)


viewstub标签同include标签一样可以用来引入一个外部布局,不同的是,viewstub引入的布局默认不会扩张,即既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。


viewstub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如进度布局、网络失败显示的刷新布局、信息出错出现的提示布局等。


通过viewstub的原理我们可以知道将一个view设置为GONE不会被解析,从而提高layout解析速度,而VISIBLE和INVISIBLE这两个可见性属性会被正常解析。


     5>如果有共用的布局,用include加载过来,不过它基本不会对布局层次产生什么优化,可能重用性和代码的优雅性会更好一点。


     6>不需要立即加载的设置为Gone或者ViewStub,因为这样系统不会解析,即不会占用CPU和内存,其实ViewStub的原理也是把它设置为Gone。


     7>一个LinearLayout里面有一个TextView和ImageView,就直接用一个TextView代替即可,这是最谷歌官方里面所建议优化的第一点。


     




减少布局层次


太深的 Layout —— Layout 的嵌套层数太深对性能有很大影响。尝试使用更扁平的 Layout ,比如

RelativeLayout

 或  GridLayout

 来提高性能。一般最多不超过10层。

     2>如果一个布局的根结点是FrameLayout并且不用设置padding和背景,那么用merge标签作为根结点会比较好,因为这样在解析时merge会被忽略,而activity的父布局也正好是FrameLayout,这只是一种巧合的典型罢了。 


     3>Merge的第二个用法就是当include一 些布局时,如果include的外层与include内容自身顶层布局是一致的,可以把include的顶层改为merge,例如是有两个上下结构的Button它的顶层你写成了merge,那么在引用它的地方的父布局必须是LinearLayout的垂直布局,这就对引用者提出了新的挑战,因为这种概率也是很小的,所以实战价值有限。


  


工具:


     1>使用Lint可以把代码和布局中的基本错误给搞定(替代layoutopt),Lint是代码规范的检测工具,比如JSLint,CSSLint,JSONLint。


     2>hierarchy viewer不实用,可以直接看布局边界。




其它优化


用SurfaceView或TextureView代替普通View


2> 使用RenderJavascript


3> 使用OpenGL绘图


4> 尽量为所有分辨率创建资源