我尝试自己实现类似SwipeListView的东西。因此,我必须在与 ListView 项目交互时为其设置动画。我在拖动 ListView 项目时使用ViewPropertyAnimator API 来做到这一点:
ListView parent_list_view = ...;
View list_view_item = ...;
int destination = ...;
long animation_time = ...;
list_view_item.animate().translationX(destination).setDuration(animation_time)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
System.out.println("animation ended");
//...
parent_list_view.invalidate(); //TODO: this can't be the solution
}
});
不幸的是,这并没有按预期工作。
如果没有使父 ListView 无效的行,我在 UI 中看不到任何变化,但一段时间后在控制台上获得“动画结束”输出。在下一次用户交互(例如触摸屏幕)上,项目直接跳转到目标位置(没有动画)。我介绍了使父项无效的行,以使项目在完成动画后“自行”跳转到其目的地。尽管如此,这不是我想要的行为。
在我看来,该项目在执行动画时并没有使自身或父视图无效。因此,UI 没有更新,我看到了项目视图的旧状态。执行任何用户交互(例如触摸屏幕)时,视图会失效并正确重绘。
我现在调查了这个问题,但不知道在哪里继续搜索错误。我知道,如果没有所有代码,很难调试这个问题。对此我很抱歉,但目前提取相关部分会非常困难。尽管如此,所有关于这个问题的建议都受到高度赞赏。也许我只是忘记了一些愚蠢的事情......