使用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动画对象。