android布局优化

优化自己的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,并且必须设定attachToRoottrue(参看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的最佳地点。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值