【发布时间】:2014-01-14 10:24:50
【问题描述】:
我有 3 个等间距的 ImageView(A、B 和 C)在屏幕上水平布置。当单击 ImageView 时,它会在屏幕上向左滑动(到 A 的位置),而其他两个消失。如果 A 是被点击的那个,那么其他两个就会消失。
翻译完成后,为翻译后的 ImageView 分配新的点击行为。现在单击它时,它会返回到其原始位置(并且未单击的 ImageViews 重新出现)。
我正在使用 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添加到ObjectAnimator(在imageViewIdx * slideDistance之前)的还原动画中,行为是否仍然存在? -
两个未点击的视图将其 alpha 值设置为 0,当这些动画结束时,它们的 alpha 值设置为 0。我尝试按照您的建议添加 0。问题依旧,但是在revert动画开始之前,ImageView跳转到了原来的位置,然后动画就开始了。
-
好的,现在可以使用了。我只需要将revert 中的imageViewIdx*slideDistance 替换为0。所以ObjectAnimator 似乎总是认为它的起始位置为0,并且知道0 = [该视图的原始位置]。这很方便,但不是我所期望的。感谢您让我走上正确的轨道@Luksprog
标签: java android android-animation