我有 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 或动画后的布局做些什么来强制它更新 View 位置吗?请记住,在第一次翻译后,ImageViews 的新点击行为工作正常,因此检测新位置没有问题。此外,当我在第一次翻译后使用 imageView.getX()
记录 ImageViews X 坐标时,它会像我期望的那样报告正确的位置(屏幕左侧)。
我的目标是最低 API 16。有人可以帮我解决这个问题吗?
最佳答案
解决方案是使用:
ObjectAnimator posterSlider = ObjectAnimator.ofFloat(imageView, "translationX", 0);
...返回动画。似乎一个 View 在翻译后“记住”了它的原始位置。因此,将 0 作为目标传递给 ObjectAnimator 等同于说“将 View 发送回其原始位置”。
关于java - ObjectAnimator 翻译后 Android View 位置未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111098/