如何让ConstraintLayout中humidityImageView的ObjectAnimator动画从初始位置启动?
解决视图动画从初始位置开始的问题
嘿,这个问题我之前也碰到过!你当前的代码之所以会从屏幕顶部开始动画,是因为你只给ObjectAnimator.ofFloat()指定了一个目标Y值——当只传单个值时,动画会默认把起始值设为0(也就是屏幕顶部的绝对坐标),而不是视图当前的位置。
要让动画从视图在ConstraintLayout中的初始位置开始,有两种简单的解决方法:
方法1:使用translationY属性(推荐)
translationY是视图相对于自身初始位置的偏移量,用它来做动画更直观,不需要计算绝对坐标:
// 从当前位置(偏移0)向下移动40像素 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(humidityImageView, "translationY", 0f, 40f); objectAnimator.setDuration(2000); objectAnimator.setRepeatCount(ValueAnimator.INFINITE); objectAnimator.start();
这样动画会平滑地从视图当前位置开始,向下偏移40像素,循环执行。
方法2:明确指定起始和结束的绝对Y坐标
如果你一定要用Y属性(绝对屏幕坐标),可以先获取视图当前的Y值作为动画的起始点,再计算目标位置:
// 获取视图当前的绝对Y坐标 float startY = humidityImageView.getY(); // 从当前位置向下移动40像素(目标Y = 当前Y + 40) ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(humidityImageView, "Y", startY, startY + 40); objectAnimator.setDuration(2000); objectAnimator.setRepeatCount(ValueAnimator.INFINITE); objectAnimator.start();
这种方式也能确保动画从视图的初始位置出发,不会跳到屏幕顶部。
总结一下:关键是必须明确动画的起始值和结束值,不能只传单个目标值,否则动画会默认从0坐标开始执行。
内容的提问来源于stack exchange,提问作者Vadim
相关产品推荐
相关产品推荐

