Java开发中能否在XML中使用变量作为属性值并按条件动态修改?
你这个需求完全可以实现,Android原生提供了对应能力支持动态修改动画属性,以下是两种常用实现方案:
方案1:加载现有XML动画后修改属性
你可以先把现有的XML文件保存到项目的res/animator/scale_anim.xml路径下,然后在Java代码中加载后遍历修改对应属性即可,示例代码:
// 加载XML中定义的动画集合 AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(context, R.animator.scale_anim); // 定义你需要动态设置的变量 float scaleFrom = 1f; float scaleTo = 20f; float pivotXFrom = 0f; float pivotXTo = 3000f; float pivotYFrom = 0f; float pivotYTo = 4500f; // 遍历所有子动画修改值 List<Animator> childAnimators = animatorSet.getChildAnimations(); for (Animator animator : childAnimators) { if (animator instanceof ObjectAnimator) { ObjectAnimator objectAnim = (ObjectAnimator) animator; String propertyName = objectAnim.getPropertyName(); switch (propertyName) { case "scaleX": case "scaleY": objectAnim.setFloatValues(scaleFrom, scaleTo); break; case "pivotX": objectAnim.setFloatValues(pivotXFrom, pivotXTo); break; case "pivotY": objectAnim.setFloatValues(pivotYFrom, pivotYTo); break; } } } // 绑定目标view后启动动画 animatorSet.setTarget(yourTargetView); animatorSet.start();
方案2:全Java代码创建动画(推荐,灵活性更高)
如果修改需求比较频繁,也可以直接不用XML定义,全用Java代码构建动画,直接传入变量即可:
// 自定义变量 int scaleDuration = 4000; int pivotDuration = 2300; float scaleFrom = 1f; float scaleTo = 14f; float pivotXFrom = 0f; float pivotXTo = 2600f; float pivotYFrom = 0f; float pivotYTo = 3900f; // 创建各个属性动画 ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(yourTargetView, "scaleX", scaleFrom, scaleTo); scaleXAnim.setDuration(scaleDuration); ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(yourTargetView, "scaleY", scaleFrom, scaleTo); scaleYAnim.setDuration(scaleDuration); ObjectAnimator pivotXAnim = ObjectAnimator.ofFloat(yourTargetView, "pivotX", pivotXFrom, pivotXTo); pivotXAnim.setDuration(pivotDuration); ObjectAnimator pivotYAnim = ObjectAnimator.ofFloat(yourTargetView, "pivotY", pivotYFrom, pivotYTo); pivotYAnim.setDuration(pivotDuration); // 构建动画集合 AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(scaleXAnim, scaleYAnim, pivotXAnim, pivotYAnim); animatorSet.start();
注意事项
- 所有属性修改操作需要在调用
start()方法前执行才会生效 - 如果需要在动画运行过程中修改值,需要先调用
cancel()停止动画,修改属性后再重新调用start()
内容的提问来源于stack exchange,提问作者Scheffler
相关产品推荐
相关产品推荐

