java - ObjectAnimator 翻译后 Android View 位置未更新

标签 java android android-animation

我有 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 返回位置时,ObjectAnimatorslideDistance 添加到 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/

相关文章:

java - 如何在hadoop 0.23.0 MR2上运行和编译java程序

java - 线程运行了一个我无法控制的无限操作。如何停止呢? [复制]

android - 如何动画和控制 Android PreferenceFragment 屏幕?

java - mangen 将 'Bundle-ManifestVersion: 1' 添加到 list 中,但 felix 似乎不接受值 1

android - 适用于 Android 的 AWS 开发工具包是否支持 IAM 新用户创建?

android - 在 Facebook 安卓上分享分数

java - 在导航中实现左侧滑动菜单

android - 垂直滚动时为图像从小到大创建动画

java - 简单的进出动画与android

java - JButtons 在鼠标悬停之前不显示