【问题标题】:Android View position not updating after ObjectAnimator tranlationObjectAnimator 翻译后,Android 视图位置未更新
【发布时间】: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 返回位置时,ObjectAnimatorslideDistance 添加到 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


【解决方案1】:

解决方案是使用:

ObjectAnimator posterSlider = ObjectAnimator.ofFloat(imageView, "translationX", 0);

...返回动画。似乎视图在翻译后“记住”了它的原始位置。因此,将 0 作为目标传递给 ObjectAnimator 与“将视图发送回其原始位置”相同。

【讨论】:

    【解决方案2】:

    您在代码中的假设是 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 是正确的。但推理是不正确的。

    希望这可以澄清疑问。

    【讨论】:

    • 感谢您的澄清
    【解决方案3】:

    我猜你会发现从ValueAnimator 类继承的reverse() 方法很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-18
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多