ValueAnimator 动画无效问题

博客讲述了在开发中遇到高版本系统下红包雨动画未执行的问题,由于用户关闭了动画时长,原有的通过反射设置ValueAnimator全局时长比例的方法失效。作者深入研究,发现可以调用ValueAnimator的setDurationScale方法解决问题,但该方法默认不允许直接调用,所以通过反射方式成功实现了在不同系统版本上的兼容处理。
摘要由CSDN通过智能技术生成

使用ValueAnimator执行动画实现红包雨效果,用户反馈动画没有执行,之后网上查询使用了反射设置动画时长值

@NonNull
private static Field getField() throws NoSuchFieldException {
    Field field = ValueAnimator.class.getDeclaredField("sDurationScale");
    field.setAccessible(true);
    return field;
}
try {
    getField().setFloat(null, 1);
} catch (Exception e) {
    e.printStackTrace();
}
低版本没问题了,但是最近发现高版本又反馈问题了,鸿蒙等,拿测试机开发者关闭动画时长,确实上面方法已经失效了,研究了好久,调用IWindowMananger里面的设置需要权限,各种闹腾网上也没有找到答案,最后查看代码,发现ValueAnimator里面有设置setDurationScale方法,可是不允许调用,然后通过反射调用,运行发现可以解决设置sDurationScale的问题了,

private void setAnimationScale(){
    try {
        Method setAnimationScale = ValueAnimator.class.getMethod("setDurationScale",float.class);
        setAnimationScale.invoke(animator, 1);
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

animator 为你创建的ValueAnimator动画对象。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值