面试的时候经常会用到布局优化,其实布局优化相对来说是比较简单的, 我也搞不懂很多人就喜欢问,问就问吧,这里本篇文章今天就来跟大家分析一下如何进行布局优化
一.为什么要布局优化
界面卡顿,或者界面元素太多太复杂了,导致UI卡顿,这就是我们需要优化的理由,其实很少有人会去管这个布局优化的,除非一些高复杂的页面,比如抖音的主页,这种高频率使用的页面
二.如何检测布局
我们可以使用SDK中的工具Hierarchy View,也可以使用Android Studio 中的 Layout Inspector,点击菜单栏 Tools 中即可看到

这里要注意的一点就是要先运行App,再执行Layout Inspector才能选择进程

当然,这个就是从结构层来表示了,一般我们看一眼也大概知道是怎么回事了,我们再来看下Hierarchy View ,Hierarchy View 在新版本的SDK中是没有的,如果想要使用需要找老版本SDK位于sdk/tools/目录下
当然,最新的SDK根目录实际上是有一个tools的压缩包的,备份好原来的,解压这个tools即可

这里我选择load view

简单又方便的操作
三.UI优化方式
适当的优化自己的代码写法这种我们就不说了,使用技巧优化目前有三种,也就是三个标签,我们分别来介绍
include
include 是为了提高布局的复用,如果某些地方出现重复的布局,可以将布局抽取出来,我们来演示一下通用的标题栏
<include
layout="@layout/layout_common_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
merge
merge标签是作为include标签的一种辅助扩展来使用,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。
Android渲染需要消耗时间,布局越复杂,性能就越差。如果用include那么势必又会多一层ViewGroup,所以include的根布局可以用merge来替换
xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
merge>
ViewStub
这是一个轻量级别的View,而且是隐藏的,因为他的视图大小为0,通常需要他的时候才会去加载,所以常用语网络错误,列表为空等展示的需求,那么如何使用呢?
<ViewStub
android:id="@+id/mViewStub"
android:layout="@layout/layout_common_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
在布局中可以看到,我定义了一个layout去加载,但是实际上运行其实是不会去加载这个layout的,我们只有当合适的时机才会去使用它,比如:
public classMainActivity extendsAppCompatActivity {
privateViewStub mViewStub;
privateButton btn_load;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private voidinitView() {
mViewStub= (ViewStub) findViewById(R.id.mViewStub);
btn_load= (Button) findViewById(R.id.btn_load);
btn_load.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View v) {
//加载
mViewStub.inflate();
}
});
}
}
这就是布局的优化方式了,当然还有很多中,比如使用约束布局ConstaintLayout ,他允许你在不适用任何嵌套的情况下创建大型而又复杂的布局,ConstaintLayout 现在已经成为了Android Studio 创建项目默认的布局了,可想而知,如果不会的同学先去学习一下ConstaintLayout 吧,好的,本文到这里就结束了,谢谢大家!
有兴趣可以加入交流群:417046685 ,我们下期再见!