Android片段动画第一次卡

Android fragment animation first time stuck

我正在片段内制作动画。

我有 2 个视图,其中一个设置在 View.GONE 上。 当我按下一个按钮时,我希望我的第二个片段将动画从底部翻译到顶部。 我做得很好而且效果很好, 问题是在我的第一个 运行 中,xml 视图消失了,但他在他应该在的同一个 Y 中。 所以我做的第一个动画没有做任何事情,只是从 GONE 切换到 VISIBLE,之后,我按下 dismiss 并且片段消失并像我想要的那样回来。 我的问题只是第一个 运行。 如何将视图 Y 设置为屏幕下方 100%?

这是我使用的代码:

private void moreCustomAnimation() {

    int yOffset = moreMenuFrameLayout.getMeasuredHeight();
    TranslateAnimation moveAnim = new TranslateAnimation(0, 0, yOffset, 0);
    moveAnim.setDuration(500);
    moveAnim.setFillAfter(true);
    blackView.setVisibility(View.VISIBLE);
    moreMenuFrameLayout.setVisibility(View.VISIBLE);
    moreMenuFrameLayout.startAnimation(moveAnim);

    moveAnim.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }
        @Override
        public void onAnimationEnd(Animation animation) {
        }
        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });
}

在离开屏幕的路上我使用相同的代码只是切换 yOffset 为另一个 Y 整数,并在动画结束时将视图设置为 GONE

非常感谢您的帮助!

第一次可以将'yOffset'值添加到视图原始点

 moreMenuFrameLayout.setY(currentYpostition + yOffset) 

这会将视图置于屏幕底部。您可以在动画开始时启用可见性。

您可以使用onGlobalLayout 事件来设置视图的位置。 像这样:

moreMenuFrameLayout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        moreMenuFrameLayout.setTranslationY(moreMenuFrameLayout.getMeasuredHeight());
        moreMenuFrameLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
});

当您的视图在被绘制到屏幕之前获得其实际大小和位置时,就会发生此事件。但是,每次绘制视图时它们都会发生,因此您必须记住在第一次后立即删除侦听器。

HTH