很多用户为了手机用起来感觉上快,在开发者选项里把系统动画给关了,即把那3个缩放比例改成了0,系统默认一般是1x。个人建议调到0.5x就很合适了,没必要关闭,否则某些动效比较多的App体验会很差。
本文的问题就是,当开发者选项中的动画缩放比例被全部调成0后,App中部分设置了duration的属性动画就会失效,表现为直接从开头跳到了结尾,没有动画过程。

我们先分析下为什么会这样。
看ValueAnimator(/frameworks/base/core/java/android/animation/ValueAnimator.java)的部分源码:

public final boolean doAnimationFrame(long frameTime) {......if (mLastFrameTime < 0) {if (mSeekFraction >= 0) {long seekTime = (long) (getScaledDuration() * mSeekFraction); // 开发者选项改后此处为0mStartTime = frameTime - seekTime;mSeekFraction = -1;}mStartTimeCommitted = false;}mLastFrameTime = frameTime;final long currentTime = Math.max(frameTime, mStartTime);boolean finished = animateBasedOnTime(currentTime);if (finished) {endAnimation();}return finished;
}boolean animateBasedOnTime(long currentTime) {boolean done = false;if (mRunning) {final long scaledDuration = getScaledDuration(); // 开发者选项改后此处为0......if (scaledDuration == 0) {// 0 duration animator, ignore the repeat count and skip to the enddone = true;} ......}return done;
}private long getScaledDuration() {return (long)(mDuration * sDurationScale); // 开发者选项修改直接影响sDuration的值
}

动画绘制是否结束取决于animateBasedOnTime方法,源码也注释到,如果duration为0,会忽略repeat count直接跳到结束状态。这里的sDurationScale也就是开发者选项中设置的动画缩放倍数。
我们只要在动画初始化后,通过反射来重置一下这个静态变量即可:

private void resetAnimatorDurationScale() {try {Field field = ValueAnimator.class.getDeclaredField("sDurationScale");field.setAccessible(true);if (field.getFloat(null) == 0) {field.setFloat(null, 1);}} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}
}

但很显然,系统会在应用进程重启后第一次调用getWindowManagerService时重设这个值,所以必须得每次启动后都设置一次(比如在主Activity的onCreate中)。

如何防止开发者选项关闭动画后使其失效相关推荐

  1. 关于解决Android系统开发者选项关闭动画后ValueAnimator不生效的问题

    一.前言 由于用户在开发者选项中关闭了动画的效果,导致App的动画不生效.但是有的App动画效果被关闭了,还依旧能有动画效果产生,这就让我们的用户觉得这是个BUG

  2. windows10加载动画_如何关闭动画并使Windows 10看起来更快

    windows10加载动画 Windows 10 fades and window animations are pure eye candy, but waiting for them to loa ...

  3. 开发打开设置洁面_用了两到三年的华为手机,一键打开开发者选项,帮助性能加速...

    用了两到三年的华为手机,可以一键打开"开发者选项",帮助性能加速 我们手机用了两到三年,速度和刚买的时候相比,明显是变慢了一大截.今天笔者就带来一个华为手机的使用小技巧,华为开发者 ...

  4. 开发打开设置洁面_用了两到三年的华为手机,一键打开quot;开发者选项quot;,帮助性能加速...

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 我们手机用了两到三年,速度和刚买的时候相比,明显是 ...

  5. 华为荣耀5X(畅玩版 全网通)USB调试模式如何开启教程(开发者模式 开发者选项打开)

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, 前一段时间,公司买了一款华为荣耀畅玩版5X全网通,进行测试.发现 拿usb数据线连接PC电脑,无法进 ...

  6. Android Studio 选项菜单和动画结合_安卓手机关于“开发者选项”你该知道的几件事...

    原标题:安卓手机关于"开发者选项"你该知道的几件事 MIUI.Flyme.EMUI.氢OS.ColorOS等等,这些都是我们耳熟能详的手机系统的名字.它们都是基于Android系统 ...

  7. 安卓开发者选项菜单里的动画选项都代表什么含义?

    第一项:提交错误报告 将本机上安卓系统的出错日志以及硬件设备信息发送给谷歌.建议:当然不想泄露自己隐私的话,不要使用! 第二项:桌面密码备份 设置或更新桌面完整备份的密码.建议:没必要设置,谁动你的备 ...

  8. 小米打开或关闭MIUI9开发者选项

    工具/原料 升级至MIUI9的设备一台. 一.开发者选项的进入 1.首先开机,来到手机主界面,点击"设置". 2.进入"设置"界面之后,点击最顶端的" ...

  9. android关闭开发者选项,开发人员选项怎么关闭?安卓手机开发人员选项功能隐藏方法介绍...

    安卓手机中的"开发人员选项"相信大家都不会陌生,很多安卓手机第一次连接电脑,都需要进入开发者选项里面,开启USB调试.很多手机需要在设置中,狂按版本号七八次,才能调出开发人员选项. ...

最新文章

  1. 基于Centos搭建nginx+uwsgi运行django环境
  2. FastDFS扩展开发说明
  3. 【bzoj1034】[ZJOI2008]泡泡堂BNB 贪心
  4. Oracle通过主键id删除记录很慢
  5. 8月全球搜索引擎市场:百度位居第四 份额大涨
  6. orchard文档之-搜索和索引
  7. 【C】输出乘法口诀表
  8. 递归法:求两个串的最大公共子序列的长度
  9. python网络爬虫程序_Python写的网络爬虫程序(很简单)
  10. 编写安全的驱动程序之验证驱动的调用者
  11. AD7705在STM32F103RBT6上的移植[硬件SPI]
  12. 海尔笔记本X3超级本拆机增加内存图文教程(解决后盖开不了问题)
  13. 关于android读取用户号码,手机串号,SIM卡序列号
  14. 台式电脑c语言如何安装,台式电脑怎么安装电源 组装机正确安装电源的方法
  15. 微信小程序如何上拉加载下一页
  16. 树的平衡 AVL Tree
  17. 基于curl 的zabbix API调用
  18. linux用户解锁pam_tally,Linux使用PAM锁定多次登陆失败的用户(含重置错误次数)...
  19. 数学建模笔记-第五讲-相关系数
  20. 什么是pinterest

热门文章

  1. MySQL--经典题目综合汇总二(进阶)--建议先把之前的看了,难度较高
  2. 【行测】“逻辑推理”聂佳课程笔记——1. 图形推理
  3. Java实现分页效果
  4. 简单几步打造彩色素描画!
  5. 生鲜系统应用的主要技术
  6. cesium实现多车辆按照轨迹移动
  7. 基于华为云TICS实现联合风控模型训练
  8. python计算圆的周长和面积
  9. git 合并分支时出现的异常解决方案----蓝字,提示输入提交信息的
  10. Python中数据类型判断type()方法