Android开发Android开发Android进阶之路

掌握Android UI性能优化,你也能成为“优化大师”

2022-05-21  本文已影响0人  码农的地中海

前言:

学习的过程中善于总结才能快速提升个人的水平,特别作为程序员。项目优化也是很重要的一部分,最近寻思着写一篇文章总结,不论是对以后的开发或者提升自身的水平都有用。在写这篇文章之前,结合自身项目经验网上多篇博客,这里做个总结,特别一些细节的原理,我也会在文末附上相关的资料链接,虽然有时候不需要了解原理。关于UI方面的优化不能光看一遍就完事了,主要还是开始时主动去培养这样的习惯,本篇的顺序主要是依照UI优化重要等级写的。

过度绘制

大家应该都了解过,简单说一下,接下来主要讲解我们实际开发中怎么去避免这种现象。Overdraw(过度绘制)是指屏幕上的某个像素在同一帧的时间内被绘制了多次。


QQ截图20220606163416.png

如果当前区域被绘制两次,就是过度绘制一次,以此类推,每绘制一次都会消耗性能CPU、GPU、还有电量等,所以作为开发就是尽量减少同一区域绘制次数。 过度绘制主要成因如下:

1、 由于布局复杂造成嵌套布局 2、布局中的view设置多层背景颜色

布局嵌套
多层背景

我这里会分为大概三种情况:

<style name="AppTheme.Launcher">
    <item name="android:windowBackground">@drawable/launch_screens</item>
</style>
复制代码

或者如下(不建议):

<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,则可以:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().setBackgroundDrawable(null);
    }
复制代码

参考链接: juejin.cn/post/684490…

##常用布局性能比较

QQ截图20220606163241.png

通过上图总结几点:

资料获取:T10级工程师必备优化手册

自定义view优化

(还有需要总结的地方)

onDraw

自定义View里面最重要,也是优化的最重要部分。

onLayout

任何时刻对View调用requestLayout()方法,都需要遍历整个View树,确定每个视图它们所占用的大小。如果在measure过程中有任何冲突,可能会多次遍历。 如果UI设计师给的效果过于复杂,就需要自定义onlayout 方法,并且可以减少嵌套问题,优化measure过程。

clipRect()

该方法用于裁剪画布,调用clipRect()方法后,只会显示被裁剪的区域,之外的区域将不会显示。 该方法最后有一个参数Region.Op,表示与之前区域的区域间运算种类,如果没有这个参数,则默认为Region.Op.INTERSECT 这几个参数的意义为:

特殊标签

include

include标签常用于将布局中的公共部分提取出来,比如页面所有的actionbar那么就可以直接include进去了。 注意事项:

merge:

merge标签是作为include标签的一种辅助扩展来使用,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。Android渲染需要消耗时间,布局越复杂,性能就越差。如上述include标签引入了之前的LinearLayout之后导致了界面多了一个层级。 注意事项:

ViewStub:

ViewStub 直接继承自View,默认是不可见的,没有measure过程,只有加载的时候才会由加载的xml替换掉(ViewStub只能inflate一次,再次进行inflate的时候会报异常)或者设置为Visibility时才可见。最大特点就是使用才加载。 这里简述一个常用的使用场景,有时候页面没有数据,会显示无数据页面或者网络异常页面,这种情况就很好的利用了使用时才去加载。

注意事项:

ViewStub于Gone的对比

设置为GONE的View不会占用布局空间,但是会进行类的初始化;如ImageView 将src设置为一个BitmapDrawable,那么该图片将会加载到内中 ViewStub只有在代码中进行inflate之后才会加载进来,不会占用内存。

性能对比: blog.csdn.net/wolinxuebin…

space

Space 经常用于组件之间的缝隙,其draw()为空,减少了绘制渲染的过程。组件之间的距离使用 Space 会提高了绘制效率,特别是对于动态设置间距会很方便高效。因为draw()为空,对该 view 没有做任务绘制渲染,所以不能对 Space 设置背景色,如果需要的间隔需要设置颜色是明显不合适的。Space 相对于View设置间距的好处是不用draw,缺点是不能设置背景色。

其他

<TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="第一行\第二行" />
复制代码

结语:

UI优化知识还需要很深入的探讨;要多去实践练习,想成为优化大师,当然还得学会许多优化技巧;比喻:启动优化、崩溃优化、卡顿优化、弱网优化、内存优化等一系列优化。

我总结出一套堪称T10级工程师的必备性能优化解析

希望这些能帮助大家,与君共勉!

上一篇 下一篇

猜你喜欢

热点阅读