使用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);
}
答案 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()
也是因素。