Android的UI调优教程

目录
  • 一、视图的层级分析:
    • <ViewStub>
  • 二、资源缩减
  • 三.屏幕的过度绘制
  • 四、分析卡顿(策略GPU的渲染能力)
  • 五、让它看起来更快

对于一个App的UI而言,在流畅性上的改进目标其实就是降低屏幕绘制的延迟,创建流畅和稳定的帧率以避免卡顿。

在理想情况下,全部的测量、布局和绘制的时间最好在16ms以内,这样才能保证屏幕运行的顺畅性。而如何对屏幕渲染和UI性能进行评估和分析呢,在Android SDK中集成了一些工具用来策略APP的渲染性能问题。

一、视图的层级分析:

对于每一个视图而言,都需要经过三个步骤:测量、布局和渲染。而App如何绘制视图,它需要从顶部节点开始测量,沿着布局树逐个渲染,视图树的层级越多,嵌套测量的次数越多,测量的时间也会越长。而一旦测量完毕就会进行布局,每个视图都会对自己的子视图进行布局,子视图布局完毕后回到父视图,然后再到根视图,布局完成后,每个视图都会被绘制在屏幕上。

显然,App的视图越多,层级越深就需要越长的时间测量、布局和绘制,为了减少这些时间,需要尽可能保持视图层级的扁平化并删除所有没有必要渲染的视图。

虽然在XML布局文件中可以查看布局的节点视图,单很难找到多余的视图,为了找到这些多余的视图,可以利用Android Studio中的Hierarchy Viewer工具来分析Android App中的视图。

Hierarchy Viewer(层次结构查看器)能够便捷地以可视化方式查看各种视图嵌套关系,可用于研究XML视图结构。(需要一个运行Android App的设备)

利用这个工具可以查看我们的View的层次,从而借助它修改我们的布局。

一般的建议:

使用抽象布局标签(include, viewstub, merge)主要是为了优化布局,去除不必要的嵌套和View节点。

  • 视图重用

多用于ListView和RecylerView等列表形式

  • 使用include嵌套布局,实现布局的模块化设计,这里需要考虑到下面谈到的merge标签的使用。
  • <merge>标签

在使用了include后可能导致布局嵌套过多,多余不必要的layout节点,从而导致解析变慢,不必要的节点和嵌套可通过hierarchy viewer或设置->开发者选项->显示布局边界查看。merge标签在UI的结构优化中起着非常重要的作用,它可以删减多余的层级,优化UI。 
merge多用于替换FrameLayout或者当一个布局包含另一个时,merge标签消除视图层次结构中多余的视图组。

merge标签可用于两种典型情况: 
a. 布局顶结点是FrameLayout且不需要设置background或padding等属性,可以用merge代替,因为Activity内容视图的parent view就是个FrameLayout,所以可以用merge消除只剩一个。 
b. 某布局作为子布局被其他布局include时,使用merge当作该布局的顶节点,这样在被引入时顶结点会自动被忽略,而将其子节点全部合并到主布局中。

<ViewStub>

viewstub标签同include标签一样可以用来引入一个外部布局,不同的是,viewstub引入的布局默认不会扩张,即既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。 
viewstub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如进度布局、网络失败显示的刷新布局、信息出错出现的提示布局等。

比如说,假设network_error.xml为只有在网络错误时才需要显示的布局,默认不会被解析。 
当我们要使用的时候,有两种方法可以使用,效果是一样的:

((ViewStub) findViewById(R.id.layout_error)).setVisibility(View.VISIBLE);

// 或者

View importPanel = ((ViewStub) findViewById(R.id.layout_error)).inflate();

二、资源缩减

第一点提到的是将App的视图结构变扁平,减少视图的数量后,其实我们还可以尝试减少每个视图里使用的资源数量。(如加载时引用一个资源,在运行时进行着色)

三.屏幕的过度绘制

屏幕的过度绘制这个概念有点类似于PhotoShop中的图层的概念,上面的图层会覆盖住下面的图层,而使得下面的图层不可见。当Android系统绘制屏幕时,首先绘制父视图而后是子视图,子视图位于其父视图上。

重绘屏幕的行为被称为过度绘制,多次的屏幕绘制会增加延迟,并且可以导致布局卡顿。

既然过度绘制的影响那么大,我们应该怎么检测呢?

Android提供了一些很好的工具来检测过度绘制,而一般采用的方式是在Debug GPU Overdraw菜单中选择“Show Overdraw area”,(在本人手机中为开发者选项中的调试GPU过度绘制),选择之后会在App的不同区域覆盖不同的颜色来表示过度绘制的次数。比较屏幕上的这些不同颜色,可以快速定位问题。

白色:没有过度绘制

蓝色:1次过度绘制(屏幕绘制了2次)

绿色:2次过度绘制

浅红色:3次过度绘制

深红色:4次或更多次过度绘制

而另外一种查看方法是借助于前面提到的Hierarchy Viewer工具,将view hierarchy保存为Photoshop文档,打开这些视图后可以看到不同层次的过度绘制情况。

四、分析卡顿(策略GPU的渲染能力)

在优化视图的层次结构和过度绘制后,App还存在丢帧或者不流畅的情况,为了获得获得更加全面的卡顿检测信息,Android系统中有一个Profile GPU Rendering的开发者选项,它能够检测出每一帧在屏幕上用了多久,策略数据可以保存到日志文件中,或者在设备上实时显示。一般而言,在屏幕上直接展示GPU的渲染数据能够更加直观地看到。

在本人的手机中,在开发者选项中找到【GPU呈现模式分析】,选择【在屏幕上显示为条形图】,然后打开一个手机QQ,就发现如下图所示情况

需要关注的是底部的那一条水平绿线,它表示设备渲染一帧要16ms,每一帧就是一个水平条,如果有很多帧超过了这条绿线就说明设备出现了卡顿情况。

五、让它看起来更快

前面讲到了如果通过测试发现问题优化布局使得UI绘制更加流畅,其实还有一个方法使得UI绘制更快:让它看起来更快。

  • 进度条
  • 动画
  • 即时更新:指用户更新了一个页面后,页面上的数据就会立刻发生变化,即使数据还没有达到服务器(这里需要确定这些数据最终一定可以更新到服务器)(离线上传,离线发送网络请求)

或者是另外一种思路,在用户添加有关图片帖子的文字时提前上传图片到服务器。

以上就是Android的UI调优教程的详细内容,更多关于Android UI调优的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android自定义UI之粒子效果

    本文实例为大家分享了Android自定义UI之粒子效果的具体代码,供大家参考,具体内容如下 1.爆炸实体类 public class Ball { public int color;//颜色 public float x;//圆心x坐标 public float y;//圆心y坐标 public float r;//粒子半径 public float vX;//粒子水平方向速度 public float vY;//粒子y方向速度 public float aX;//粒子水平方向加速度 publi

  • Android ListView UI组件使用说明

    一.ListView 该组件是android中最常用的一个UI组件,用于实现在屏幕上显示​多个内容,以便于我们用手指来回翻转. 先在layout中进行布局我们的组件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent

  • android10 隐藏SystemUI锁屏下的多用户图标的示例代码

    需求:如上图,需要隐藏右上角的多用户蓝色图标. 修改后结果如下: 锁屏相关的布局在SystemUI frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java //更新多用户图标的可见性 private void updateVisibilities() { if (mMultiUserSwitch.getParent() != mStatusIconA

  • android UI绘制加减号按钮

    本文实例为大家分享了android UI绘制加减号按钮的具体代码,供大家参考,具体内容如下 在项目中我们常常会用到这么一个view. 这时候我们会选择使用两个图片来相互切换.其实,只要会基本的2D绘图这样简单的图片自己绘制出来不在话下. 先给出我做出来的效果图: 接下来,我将给出加号减号绘制的代码以供大家参考: 以下是关键代码 /** * +号 */ public class AddView extends View { protected Paint paint; protected int

  • Android开发之自定义UI组件详解

    Android开发自定义UI组件实现红色小球跟随手指移动 要写实现自定义UI组件,要创建一个BallView类,继承View类,在BallView类中创建画笔,然后重写OnDraw()方法和OnTouchEvent()方法. /** * Created by nuist__NJUPT on 2021/5/9. * 自定义UI组件 * View组件在布局中是一个矩形的空白区域,没有任何内容 * 而UI组件之所以有内容,是因为继承了View组件之后在其提供的空白区域上重新绘制外观,这就是UI组件的实

  • Android用viewPager2实现UI界面翻页滚动的效果

    1.先在build.gradle(Module)下添加引用viewPager2的库 implementation 'androidx.viewpager2:viewpager2:1.0.0' 2.在MainActivity下新建一个viewPager2 ViewPager2 viewPager = findViewById(R.id.viewPager); ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(); viewPager.

  • Android的UI调优教程

    目录 一.视图的层级分析: <ViewStub> 二.资源缩减 三.屏幕的过度绘制 四.分析卡顿(策略GPU的渲染能力) 五.让它看起来更快 对于一个App的UI而言,在流畅性上的改进目标其实就是降低屏幕绘制的延迟,创建流畅和稳定的帧率以避免卡顿. 在理想情况下,全部的测量.布局和绘制的时间最好在16ms以内,这样才能保证屏幕运行的顺畅性.而如何对屏幕渲染和UI性能进行评估和分析呢,在Android SDK中集成了一些工具用来策略APP的渲染性能问题. 一.视图的层级分析: 对于每一个视图而言

  • Android性能调优利器StrictMode应用分析

    作为Android开发,日常的开发工作中或多或少要接触到性能问题,比如我的Android程序运行缓慢卡顿,并且常常出现ANR对话框等等问题.既然有性能问题,就需要进行性能优化.正所谓工欲善其事,必先利其器.一个好的工具,可以帮助我们发现并定位问题,进而有的放矢进行解决.本文主要介绍StrictMode 在Android 应用开发中的应用和一些问题. 什么是StrictMode StrictMode意思为严格模式,是用来检测程序中违例情况的开发者工具.最常用的场景就是检测主线程中本地磁盘和网络读写

  • Jvm调优和SpringBoot项目优化的详细教程

    一.Jvm调优. 参考文章 1.先看一下未设置JVM参数的情况,默认情况下,没有设置任何Jvm参数. idea中安装VisualVM监控jvm的图文教程 2.设置Jvm参数. 配置参数: 关于这些设置的JVM参数是什么意思,参考Jvm调优. -XX:MetaspaceSize=128m (元空间默认大小) -XX:MaxMetaspaceSize=128m (元空间最大大小) -Xms1024m (堆最大大小) -Xmx1024m (堆默认大小) -Xmn256m (新生代大小) -Xss256

  • Android编程实现仿优酷圆盘旋转菜单效果的方法详解【附demo源码下载】

    本文实例讲述了Android编程实现仿优酷圆盘旋转菜单效果的方法.分享给大家供大家参考,具体如下: 目前,用户对安卓应用程序的UI设计要求越来越高,因此,掌握一些新颖的设计很有必要. 比如菜单,传统的菜单已经不能满足用户的需求. 其中优酷中圆盘旋转菜单的实现就比较优秀,这里我提供下我的思路及实现,仅供参考. 该菜单共分里外三层导航菜单.可以依次从外向里关闭三层菜单,也可以反向打开,并且伴有圆盘旋转的动画效果 首先,看下效果: 以下是具体的代码及解释: 1. 菜单布局文件: 大家看到主要有三个Ra

  • Android开发 -- UI界面之threme和style

    Android系统的themes.xml和style.xml(位于\base\core\res\res\values\)包含了很多系统定义好的style,建议在里面挑个合适的,然后再继承修改. 一.threme android中的主题一般用于窗体级别的,用于改变窗体样式 1.Theme: 它的意思为默认状态,即如果theme这里不填任何属性的时候,默认为Theme 1.1.Theme_NoDisplay 它的意思为任何都不显示.比较适用于只是运行了activity,但未显示任何东西. 1.2.T

  • Android Studio手动打包的教程图解

    项目写完了,现在需要把应用上传到市场上面,那么怎么把项目打包成apk?(Android的可安装文件). 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件也别丢了,这个很重要 为什么要打包 我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,那么在我们项目Project目录的build/outputs/apk目录下可以找到刚刚生成的app-debug.apk. 直接把这个上传给市场不就行了吗. NO,当然不行

  • 详解android studio游戏摇杆开发教程,仿王者荣耀摇杆

    最近在做一个山寨版的王者荣耀,刚开始做的时候毫无头绪 摇杆的多点触控做的特别烂 经过几天的思考已完美解决所有问题,下面就和大家分享下这个摇杆的开发思路 若有不正之处,请多多谅解并欢迎指正. 首先这个摇杆要用到较多的数学知识,小编的数学特别烂也就高中水平吧 我们这个摇杆一共就五个按钮,一个移动摇杆.三个技能摇杆和一个普通攻击按钮 最终效果 好了废话少说让我们开始吧 新建一个项目 建好项目之后,我们先新建一个类叫做"画".也是我们的主View 修改Hua.java的代码 public cl

  • android蓝牙简单开发示例教程

    目录 概述 1.权限申请 2.打开蓝牙 3.接收蓝牙状态的改变 4.扫描其他的设备 5.蓝牙配对 6.获取已经配对的设备 7.连接设备 概述 前段时间学习了一些蓝牙开发的知识,记录一下Android中蓝牙的简单开发.下面是最重要的两个类. BluetoothAdapter : 蓝牙适配器,通过getDefaultAdapter ()去获取一个实例,如果设备不支持蓝牙的话,返回的是一个null对象,通过它,可以打开.关闭蓝牙,扫描设备.向指定设备创建socket通道- BluetoothDevic

  • jvm垃圾回收GC调优基础原理分析

    目录 核心概念(Core Concepts) Latency(延迟) Throughput(吞吐量) Capacity(系统容量) 相关示例 Tuning for Latency(调优延迟指标) Tuning for Throughput(吞吐量调优) Tuning for Capacity(调优系统容量) 说明: Capacity: 性能,能力,系统容量; 文中翻译为”系统容量“; 意为硬件配置. GC调优(Tuning Garbage Collection)和其他性能调优是同样的原理.初学者

  • Android 超详细SplashScreen入门教程

    这次的Android系统变化当中,UI的变化无疑是巨大的.Google在Android 12中采取了一种叫作Material You的界面设计,一切以你为中心,以你的喜好为风格.相信大家一旦上手Android 12之后应该能立刻察觉到这些视觉方面的变化. 关于这个SplashScreen,今天就值得好好讲一讲了. 什么是SplashScreen SplashScreen其实通俗点讲就是指的闪屏界面.这个我们国内开发者一定不会陌生,因为绝大多数的国内App都会有闪屏界面这个功能,很多的App还会利

随机推荐