我在屏幕上水平布置了3个等间距的ImageView(A,B和C)。单击ImageView时,它会在屏幕上向左滑动(到A的位置),另外两个消失。如果A是被点击的那个,那么另外两个就消失了。
翻译完成后,将为翻译后的ImageView分配新的点击行为。当它现在被点击时,它将返回到其原始位置(并且未重新显示未显示的ImageView)。
我正在使用 ObjectAnimator 进行翻译,我使用一个预先计算的值来确定点击的ImageView应该移动多远。此值是每个ImageView的最左边与其邻居之间的像素距离。检测到第一次单击时,ImageView的动画如下:
ObjectAnimator posterSlider = ObjectAnimator.ofFloat(
imageView, "translationX", -imageViewIdx * slideDistance);
因此,在A的情况下,父视图中的ImageViews索引位置将为0,当乘以滑动距离时,它仍将为0,因此它永远不会移动。如果索引位置为1,则滑动距离为-slideDisance等。并且它工作正常。
问题是当ImageView第二次单击后返回到原始位置时,翻译位置不正确。翻译代码与上述内容完全相同,只是代替-imageViewIdx * slideDistance
它变为imageViewIdx * slideDistance
。在 B 返回其原始位置的情况下,它实际上返回到 C 的位置。在 C 返回其原始位置的情况下,它会从屏幕向右移动。 A 工作正常,但这只是一个侥幸,因为它根本不需要移动。
因此很明显,在确定ImageViews返回位置时, ObjectAnimator 正在将slideDistance
添加到ImageViews 原始位置,而不是新位置第一次点击后,就像我期望的那样。
是否需要使用 ObjectAnimator 或动画后的布局来强制它更新视图位置?请记住,在第一次翻译后,ImageViews的新点击行为可以正常工作,因此使用该行为检测新位置没有问题。此外,当我使用imageView.getX()
在第一次翻译后记录ImageViews X坐标时,它会像我期望的那样报告正确的位置(屏幕的左侧)。
我的目标是最低API 16.任何人都可以帮我这个吗?
答案 0 :(得分:6)
解决方案是使用:
ObjectAnimator posterSlider = ObjectAnimator.ofFloat(imageView, "translationX", 0);
...用于返回动画。似乎一个视图在翻译后“记住”其原始位置。因此,将0作为目标传递给ObjectAnimator与说“将视图发送回原始位置”相同。
答案 1 :(得分:4)
您在代码中的假设是ObjectAnimator会将translationX
的值更改为imageViewIdx * slideDistance
。
实际上,ObjectAnimator会将translationX
的值更改为imageViewIdx * slideDistance
。
Initial State -
Left = XYZ (say)
TranslationX = 0
X = Left + TranslationX = XYZ
After 1st Click -
Left = XYZ
TranslationX = -(imageViewIdx * slideDistance)
X = Left + TranslationX = XYZ - (imageViewIdx * slideDistance)
After 2nd Click -
Left = XYZ
Translation X = imageViewIdx * slideDistance
X = Left + TranslationX = XYZ + (imageViewIdx * slideDistance)
因此,您自己建议的将translationX设置为0的修正是正确的。但推理是不正确的。
希望这能澄清疑点。
答案 2 :(得分:2)
我猜你可以找到从reverse()
类继承的ValueAnimator
方法有用。