如何在运行时修改AnimatorSet中ObjectAnimator的Xml配置值?
动态修改AnimatorSet中ObjectAnimator的参数(无需替换或拆分XML)
当然可行!不用替换整个XML文件,也不用拆分它,你完全可以在运行时直接定位到AnimatorSet里的目标ObjectAnimator,然后修改它的参数值。下面是具体的实现思路和示例代码:
步骤1:加载XML中的AnimatorSet
使用AnimatorInflater.loadAnimator()方法加载你的animator目录下的XML文件,得到AnimatorSet实例。步骤2:遍历并定位目标ObjectAnimator
通过AnimatorSet.getChildren()方法获取所有子动画,逐个判断是否为ObjectAnimator,再根据propertyName(比如你要修改的rotationY)找到你需要调整的那个动画。步骤3:修改目标参数
找到目标动画后,调用对应类型的方法修改参数值——比如你的例子里是float类型的valueFrom,就用setFloatValues()方法,同时要把原有的valueTo也传入(因为这个方法会覆盖原有的值范围)。
完整示例代码
// 加载XML中的AnimatorSet AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(context, R.animator.your_anim_file); // 遍历所有子动画,找到目标ObjectAnimator for (Animator anim : animatorSet.getChildren()) { if (anim instanceof ObjectAnimator) { ObjectAnimator targetAnimator = (ObjectAnimator) anim; // 通过propertyName匹配你要修改的动画 if ("rotationY".equals(targetAnimator.getPropertyName())) { // 修改valueFrom为你想要的数值,这里示例改成-150,同时保留原valueTo=0 targetAnimator.setFloatValues(-150f, 0f); break; } } } // 设置动画目标并启动 animatorSet.setTarget(yourTargetView); animatorSet.start();
补充说明
如果你的动画参数是其他类型(比如int),可以使用对应的setIntValues()方法;如果只想修改valueFrom而不想动valueTo,也可以先通过getValues()获取当前的数值数组,修改第一个元素后再用setValues()设置回去,不过直接用setFloatValues()会更简洁直观。
内容的提问来源于stack exchange,提问作者Schelmuffsky
相关产品推荐
相关产品推荐

