Android:在视图的锚点发生变化后,setTranslationX出现故障

时间:2016-08-03 02:44:12

标签: android android-animation android-view

使用setTranslationX,我试图在屏幕上滑动视图时为其设置动画。然后在它通过阈值-X后,我为视图分配一个新的RelativeLayout.RIGHT_OF。

我希望它在此时停止动画(无论我是否继续滑动)并基本上锁定到新锚点。

这就是问题所在:突然视图将X位置跳到新锚点的右侧。

我已尝试设置setTranslationX(0),但是后来我看到视图twitch / flash两次,一次到原来的0,然后到新的0

我很想摆脱那种双重抽搐/闪光,但现在还不知道如何。

@Override
public void onChildDraw(Canvas c ... float dX) {
    threshold = anchorView.getRight();

    if (animate) {
        if (dX >= 0) {
            translationX = Math.min(dX, threshold);

            if (dX >= threshold) {
                translationX = 0;  // (A) if I do this, then mainView flashs twice: original 0, then new 0
                setToRightOf(mainView, anchorView);
                mainView.invalidate();  // has no effect
            }
        } else {
            translationX = 0;
        }

        // if I don't do (A), then mainView will suddenly jump to 2*threshold
        mainView.setTranslationX(translationX);
        return;
    }

    super.onChildDraw(c ... dX);
}

1 个答案:

答案 0 :(得分:1)

好的,不是在onDraw期间指定RelativeLayout.RIGHT_OF来设置阈值边界,而是在触摸离开屏幕时将其取出并分配。

但为了确保在刷卡时我不会在该阈值后面滑动,我必须添加另一个案例来检查translationX而不是之前尝试依赖于RelativeLayout锚点。

现在,我使用setTag()getTag()来帮助确认滑动过程中的阈值:

if (dX >= 0) {
    if ((Object) past != tag)
        translationX = Math.min(dX, threshold);
    else
        translationX = threshold;

    if (dX >= threshold) {
        if ((Object) past != tag) {
            anchorView.setTag(past);
        }
    }
} else {
    ...
}

另外还有其他几个地方可以确保我在需要时重置anchorView的标签和translationX,然后一切都很好。

现在有效!

(不直接解决双重闪光/抽搐问题,但针对同一目标采用不同方法)

(除了使用setTag()之外的任何其他建议?)

P.S。在我之前的尝试中,我后来尝试invalidate()而不是mainView.requestLayout(),但也没有成功,认为requestLayout()也是因素。