学习的过程当中善于总结才能快速提高我的的水平,特别做为程序员。项目优化也是很重要的一部分,最近寻思着写一篇文章总结,不管是对之后的开发或者提高自身的水平都有用。在写这篇文章以前,结合自身项目经验网上多篇博客,这里作个总结,特别一些细节的原理,我也会在文末附上相关的连接,虽然有时候不须要了解原理。关于UI方面的优化不能光看一遍就完事了,主要仍是开始时主动去培养这样的习惯,本篇的顺序主要是依照UI优化重要等级写的。android
你们应该都了解过,简单说一下,接下来主要讲解咱们实际开发中怎么去避免这种现象。Overdraw(过分绘制)是指屏幕上的某个像素在同一帧的时间内被绘制了屡次。 git
一、 因为布局复杂形成嵌套布局 二、布局中的view设置多层背景颜色程序员
我这里会分为大概三种状况:github
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/launch_screens</item>
</style>
复制代码
或者以下(不建议):bash
<style name="SplashTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowDisablePreview">true</item>
</style>
复制代码
设置加载以后在oncreat()方法中再设置以下除去内存占用网络
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//将window的背景图设置为空
getWindow().setBackgroundDrawable(null);
super.onCreate(savedInstanceState);
}
复制代码
若是是普通Activity,则能够:ide
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setBackgroundDrawable(null);
}
复制代码
参考连接: juejin.im/post/5bf8f9…工具
##经常使用布局性能比较布局
经过上图总结几点:post
(还有须要总结的地方)
自定义View里面最重要,也是优化的最重要部分。
ondraw方法里面尽可能不要去初始化对象,初始化过程放在构造方法里,在ondraw方法里面初始变量,若是须要invalidate(),则会一直调用ondraw(),会致使内存一直建立和回收,形成内存抖动。
不要频繁的设置可见于不可见方法,这样也会调用,尽可能在xml设置的就是默认的状态,减小ondraw方法调用。
尽可能在View的内容发生改变的时候才去触发invalidate方法
尽可能使用ClipRect等方法来提升绘制的性能(重叠的部分不去绘制)。
减小没必要要元素的绘制
不在屏幕的元素尽可能使用Canvas.quickReject把他们给剔除
任什么时候刻对View调用requestLayout()方法,都须要遍历整个View树,肯定每一个视图它们所占用的大小。若是在measure过程当中有任何冲突,可能会屡次遍历。 若是UI设计师给的效果过于复杂,就须要自定义onlayout 方法,而且能够减小嵌套问题,优化measure过程。
该方法用于裁剪画布,调用clipRect()方法后,只会显示被裁剪的区域,以外的区域将不会显示。 该方法最后有一个参数Region.Op,表示与以前区域的区域间运算种类,若是没有这个参数,则默认为Region.Op.INTERSECT 这几个参数的意义为:
include标签经常使用于将布局中的公共部分提取出来,好比页面全部的actionbar那么就能够直接include进去了。 注意事项:
merge标签是做为include标签的一种辅助扩展来使用,它的主要做用是为了防止在引用布局文件时产生多余的布局嵌套。Android渲染须要消耗时间,布局越复杂,性能就越差。如上述include标签引入了以前的LinearLayout以后致使了界面多了一个层级。 注意事项:
ViewStub 直接继承自View,默认是不可见的,没有measure过程,只有加载的时候才会由加载的xml替换掉(ViewStub只能inflate一次,再次进行inflate的时候会报异常)或者设置为Visibility时才可见。最大特色就是使用才加载。 这里简述一个经常使用的使用场景,有时候页面没有数据,会显示无数据页面或者网络异常页面,这种状况就很好的利用了使用时才去加载。
注意事项:
设置为GONE的View不会占用布局空间,可是会进行类的初始化;如ImageView 将src设置为一个BitmapDrawable,那么该图片将会加载到内中 ViewStub只有在代码中进行inflate以后才会加载进来,不会占用内存。
性能对比: blog.csdn.net/wolinxuebin…
Space 常常用于组件之间的缝隙,其draw()为空,减小了绘制渲染的过程。组件之间的距离使用 Space 会提升了绘制效率,特别是对于动态设置间距会很方便高效。由于draw()为空,对该 view 没有作任务绘制渲染,因此不能对 Space 设置背景色,若是须要的间隔须要设置颜色是明显不合适的。Space 相对于View设置间距的好处是不用draw,缺点是不能设置背景色。
若是初始化View不可见的时候,使用View.GONE代替View.VISIBLE,设置GONE的view会加载的时候标记,不会去measure过程。
减小alpha值对性能的影响 对于不透明的View,显示它只须要渲染一次便可,但是若是这个View设置了alpha 值,会至少须要渲染两次。缘由是包含alpha的view须要事先知道混合View的下一层元素是什么,而后再结合上层的View进行Blend混色处理,而且对于设置。
TextView设置文字和图片减小View的解析加载
使用TextView设置换行功能,例如:
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="第一行\第二行" />
复制代码
UI渲染
blog.csdn.net/lmj62356579… UI卡顿优化
blog.csdn.net/joye123/art…
UI优化工具Lint
blog.csdn.net/luzhenyuxfc…
UI优化工具Hierarchy Viewer
www.jianshu.com/p/e9e05ce5b… github.com/romainguy/V…