View位置平移动画异常:设置5秒时长仍速度过快
解决View平移动画时长无效的问题
嘿,我帮你找到问题啦!你设置的5秒动画时长完全没效果,动画直接跳到目标位置,核心问题是**ObjectAnimator.ofFloat()的参数用法错误**,咱们一步步来修正:
问题根源
你写的代码存在两个关键错误:
ObjectAnimator.ofFloat(device, View.X, View.Y, path)中,同时传入了View.X和View.Y两个属性,但这个重载方法的第二个参数只能接收单个属性(属性名或Property对象),多传属性会导致动画逻辑混乱,直接忽略时长设置,瞬间完成属性变更。- 你的
Path只调用了moveTo(625, 300),没有后续的路径指令(比如lineTo),就算用法正确,动画也不会有过渡过程,直接跳到这个坐标点。
两种正确的实现方案
方案一:用ViewPropertyAnimator(最简洁直观)
如果只是要实现View沿路径平移,ViewPropertyAnimator的语法更简单,还能正确识别你设置的时长:
Path path = new Path(); path.moveTo(625, 300); // 必须添加后续路径,比如指定目标位置 path.lineTo(你的目标X坐标, 你的目标Y坐标); device.animate() .path(path) .setDuration(5000) .start();
方案二:用ObjectAnimator(更灵活,适合复杂动画场景)
如果必须使用ObjectAnimator,可以通过PropertyValuesHolder来同时绑定X、Y属性的动画:
Path path = new Path(); path.moveTo(625, 300); path.lineTo(你的目标X坐标, 你的目标Y坐标); // 分别为X、Y属性创建动画holder PropertyValuesHolder xProperty = PropertyValuesHolder.ofFloat(View.X, path); PropertyValuesHolder yProperty = PropertyValuesHolder.ofFloat(View.Y, path); ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(device, xProperty, yProperty); animator.setDuration(5000); animator.start();
额外注意事项
- 一定要给
Path添加移动指令(比如lineTo、quadTo),否则动画没有过渡过程,看起来还是瞬间跳转。 - 确保
device这个View已经被正确添加到布局中,并且完成了测量和布局流程,不然动画可能无法正常执行。
内容的提问来源于stack exchange,提问作者bin_ja
相关产品推荐
相关产品推荐

