android动画帧率_Android性能优化-你的lottie动画今天跳帧了吗?

2023-05-16

问题现象

底部tab,现在大家都很熟悉了,点击一个tab 就切换一个fragment,现在主流的做法渐渐演变成点击底部tab的时候

对应的icon要做一些动画。通常而言,我们在做类似动画时往往依赖的是lottie这个动画库(别问为什么,问就是不会做,做的烂)。然而在实际开发中,我们发现如果这个动画稍微复杂一些,就会出现不易察觉的丢帧现象。往往表现在:

第一次点击tab的时候,因为涉及到对应fragment的初始化(可能会有一些耗时操作),所以会导致 该lottie动画 有一点点丢帧的现象,看上去就好像一个本应该执行10帧的动画 只执行了不到10帧。

怎么证明这个动画执行的不完美?

比如说 我们可以 打印一下这个动画的执行过程

mLottieAnimationView.addAnimatorUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

Log.v("wuyue", "onAnimationUpdate ===" + animation.getAnimatedFraction());

}

});

复制代码

第一次执行动画时,注意这一次执行动画的时候会伴随着对应的fragment的初始化。

第二次执行动画时,往往fragment都初始化完毕了。

我们可以明显的看出来,第一次的动画执行 步骤少了许多,也就是说有很多frame,也就是有很多帧,是没有展示到的。

如果你的动画足够精细和复杂 那是可以肉眼看出来的动画不完美。 如果你的动画做的不够精细,那往往肉眼看不出来,可能要通过我这种方法打印日志才能看的出来。

lottie做了什么?为什么动画执行丢帧?

上述的现象其实不难推测,因为fragment第一次初始化的时候可能会消耗一些系统资源,或者说这个fragment的代码写的不够好,本身会导致主线程卡顿。

可是为什么主线程卡顿会导致lottie动画没有完美执行?难道lottie有什么魔法?还能主动探测帧率自动降频操作?带着这些疑问,

我们来翻一翻源码,看看lottie到底做了什么。

我们这里稍微解释一下

public interface FrameCallback {

/**

* Called when a new display frame is being rendered.

*

* This method provides the time in nanoseconds when the frame started being rendered.

* The frame time provides a stable time base for synchronizing animations

* and drawing. It should be used instead of {@link SystemClock#uptimeMillis()}

* or {@link System#nanoTime()} for animations and drawing in the UI. Using the frame

* time helps to reduce inter-frame jitter because the frame time is fixed at the time

* the frame was scheduled to start, regardless of when the animations or drawing

* callback actually runs. All callbacks that run as part of rendering a frame will

* observe the same frame time so using the frame time also helps to synchronize effects

* that are performed by different callbacks.

*

* Please note that the framework already takes care to process animations and

* drawing using the frame time as a stable time base. Most applications should

* not need to use the frame time information directly.

*

*

* @param frameTimeNanos The time in nanoseconds when the frame started being rendered,

* in the {@link System#nanoTime()} timebase. Divide this value by {@code 1000000}

* to convert it to the {@link SystemClock#uptimeMillis()} time base.

*/

public void doFrame(long frameTimeNanos);

}

复制代码

这个回调里面的doFrame方法 你就把他理解成 每次界面绘制完一帧的时候,就会回调一次这个接口。那么在这个回调方法里面,我们计算一下和前一次回调的时间差,就可以知道这个界面绘制是否卡顿,这是目前主流app做帧率检测的方案。

那么lottie 拿到这个回调到底要做什么呢?

到这里就真相大白了,回头再细细品味一下,可以想到lottie对动画的优化也是到了一定境界了,他没有粗暴的让动画每一帧都去执行,而是根据doFrame 来决定执行哪一帧,避免对整个ui系统 增加负担。如果系统运行正常,那么动画就完美执行,系统运行有掉帧的情况,那么就跳过一些帧,尽快让动画执行完毕。

问题怎么修复?

其实整个问题有两个修复方案:

用systrace来做监控,看看到底第一次初始化fragment的时候 是卡在哪里了,直接修复问题的本质。这种修复方案更加彻底,但是美中不足的是需要一定的时间,且如果你本身对这块代码不熟悉,建议不要在项目临近发布的时候采用这种修复方案

既然是fragment第一次初始化的时候才会有这种问题,那我们稍微延迟一下第一次动画的执行时机,让他在fragment初始化完毕以后再去执行动画不就行了?

代码如下:

@Override

public void onResume() {

super.onResume();

//确保当fragment 初始化完毕以后 主动调用一下 tab切的动画

if (mIsFirstInitFlag ) {

((MainActivity) getActivity()).playForumLottieAnim();

mIsFirstInitFlag = false;

}

}

复制代码

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[Android性能优化-你的lottie动画今天跳帧了吗?]http://www.zyiz.net/tech/detail-116116.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android动画帧率_Android性能优化-你的lottie动画今天跳帧了吗? 的相关文章

  • 解决kindeditor上传图片、文件的错误。

    项目中使用到了富文本编辑器 xff0c 使用之后感觉非常的棒 xff01 之前使用的是ckeditor xff0c 本次项目打算使用的也是ckeditor xff0c 但是后来有些嵌套表格里面格式的显示的问题实在是比较乱 所以使用了本文介绍
  • Windows 机器通过 FTP 上传文件

    用户可使用 FTP 通道 xff0c 将应用程序从本地服务器上传到云服务器中 操作步骤 步骤一 xff1a 在云服务器配置 FTP 服务 以 CentOS 系统为例 在 root 权限下 xff0c 通过命令 yum install vsf
  • Android:onNewIntent()触发机制及注意事项

    为什么80 的码农都做不了架构师 xff1f gt gt gt 一 onNewIntent 在 IntentActivity 中重写下列方法 xff1a onCreate onStart onRestart onResume onPause
  • 大气压随温度变化表_钓鱼与气压温度风向的关系春夏秋冬钓鱼最好时间图表

    详解钓鱼与气压之间的关系 xff1a 刀牛姐夫制作 欢迎留言 谢谢 什么样的气压适合钓鱼 xff1f 大气压力在1002 1054毫巴为好钓 xff1b 其中在1006 1028毫巴为很好钓 xff01 那么 xff0c 怎样才能了解气压的
  • linux的xstart命令怎么不能用,配置使通过Xmanager xstart远程连接linux

    安装gpm软件包 yum install gpm yum install gdm 1 编辑配置文件 etc gdm custom conf root 64 localhost vi etc gdm custom conf 找到以下两行 se
  • .NET Core 的缓存篇之MemoryCache

    前言 对于缓存我们都已经很熟悉了 缓存分为很多种 xff0c 浏览器缓存 试图缓存 服务器缓存 数据库缓存等等一些 xff0c 那今天我们先介绍一下视图缓存和MemoryCache内存缓存的概念和用法 xff1a 视图缓存 在老的版本的MV
  • 源码安装 MariaDB

    为什么80 的码农都做不了架构师 xff1f gt gt gt 官方文档 一 安装依赖组件 root 64 localhost yum y install gcc gcc c 43 43 make cmake ncurses ncurses
  • Centos的故障排除

    环境 xff1a centos 6 4 x86 64 所需工具 xff1a CentOS 6 4 x86 64 LiveDVD iso下载地址 xff1a http mirrors 163 com centos 6 4 isos 首先介绍
  • 服务器亮黄灯问题检查方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 找到硬盘和主板的位置 拔出主板 xff08 如图位置4块主板 xff09 xff0c 检查内存条是否松动 xff0c 建议重新插上内存 一个节点一块硬盘 xff0c 硬盘位
  • failed to open stream :HTTP request failed 解决方法

    用curl抓取 xff0c 不要用file get contents 前者比后者效率高一点 转载于 https www cnblogs com Basu p 7940167 html
  • Android通过第三方软件打开Word、Excel、PPT、PDF等文档

    近期公司有个需求 xff0c PDF格式需要在应用内打开浏览 xff0c Word Excel要求不高直接用第三方软件打开即可 xff0c 找了两种解决办法 第一 xff0c 全部在应用内打开 xff0c 可接入腾讯的TBS xff08 没
  • mariadb数据库文件的组成

    一 日志文件 1 错误日志 xff1a error log 错误日志记录msyql运行过程中所有较为严重的警告和错误信息 xff0c 以及mariadb server 每一次启动和关闭的详细信息 xff0c 事件调度运行一个事件时产生的信息
  • FTP中的授权规则

    在授权规则中 xff0c 你可以管理自己的FTP站点以怎样的方式进行访问 xff0c 比如每个进入站点的人都需要输入用户名密码 正则可以在授权规则中删除默认的配置 允许匿名用户读取 的规则 也可以在此处 xff0c 对不同的组或用户进行粒度
  • docker应用实例——httpd

    docker可以用来创建虚拟环境跑应用 xff0c 各个应用能起到隔离作用 步骤也很简单 xff0c 就是获取 下拉镜像 应用 xff0c 然后进行安装就可以了 1 搜索镜像 xff0c 比如我想虚拟一个httpd应用 xff0c 可以看到
  • curl: (1) Protocol "'http" not supported or disabled in libcurl

    Windows下安装Curl 下载的64位版本 下载后 xff0c 将以下文件复制到 D Windows 目录下 注意 xff1a 我的系统在D盘 但是使用以下命令时 xff1a curl X GET 39 http localhost 9
  • ios UILabel 字体设置 大全

    2019独角兽企业重金招聘Python工程师标准 gt gt gt code UILabel垂直居上对齐 label sizeToFit 设置文字过长时的显示格式 label lineBreakMode 61 UILineBreakMode
  • Activity关于onConfigurationChanged方法

    方法介绍 方法 xff1a public void onConfigurationChanged Configuration newConfig 场景 xff1a 当系统的 配置信息 发生改变时 xff0c 系统会调用此方法 前提是 xff
  • Ubuntu server10.4实现自动登录

    下面是网上找的方法 xff1a 注意 这里的修改要非常小心 xff0c 出来命令不能敲错之外 xff0c 一定要记得执行 chmod 43 x autologin xff0c 不然搞不好可能会导致启动不了 xff0c 我在操作的时候就因为忘
  • FTP服务器之身份验证、授权及隔离详解

    FTP 服务器之身份验证 授权及隔离 贰零壹叁年拾月国庆假期 YoloSntim 简介 Windows 中较为基本服务器功能 xff0c 提供文件上下载功能 可单服务器管理 xff0c 亦可与域集成在一起 网上有许多介绍及教程 xff0c
  • C++到底还能做什么?

    嗯 xff0c 这是一位朋友发到我邮箱里面的 xff0c 很奇怪 xff0c 发到了gmail邮箱 xff0c 而不是我常用的hotmail邮箱哈 我呢 xff0c 试着回答一下 xff0c 如果回答得不好 xff0c 叫做肖某人学艺不精

随机推荐