使用动画将视图的可见性从消失变为可见

Animate visibility of a view from gone to visible with animation

我的视图默认为 invisible(第一次)。

现在我需要使用 animation:

将可见性切换到 VISIBLE
if (myView.getVisibility() == View.INVISIBLE) {
    myView.setVisibility(View.VISIBLE);
    myView.animate().translationY(0);
 }

(喜欢SnackBar默认动画)

但这不起作用。它将通过默认动画变为可见

有什么简单的方法可以做到这一点吗?

备注

我正在动画化我的视图以消除,如下所示:

myView.animate().translationY(myView.getHeight());

您可以使用 XML 动画来做到这一点。

使用 setalpha 创建一个 slide-up 动画 XML 并将此 XML 放入您的资源 anim 文件夹中。

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromYDelta="100%"
        android:toYDelta="0" />
</set>

使用:

使用AnimationUtils.loadAnimation()XML加载动画并使用.startAnimation()方法设置和启动动画。

举个例子:

ImageView imageView = (ImageView) findViewById(R.id.imageView);

// slide-up animation
Animation slideUp = AnimationUtils.loadAnimation(this, R.anim.slide_up);

if (imageView.getVisibility() == View.INVISIBLE) {
    imageView.setVisibility(View.VISIBLE);
    imageView.startAnimation(slideUp);
}

希望对你有所帮助~

基于答案:

使用此方法,我可以将视图的 visibility 设置为 VISIBLE,并带有 slideUp 动画(如 snackbar 动画):

int getScreenHeight() {
    DisplayMetrics displaymetrics = new DisplayMetrics();
    activity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    return displaymetrics.heightPixels;
}

public void animateOnScreen(View view) {
    final int screenHeight = getScreenHeight();
    ObjectAnimator animator = ObjectAnimator.ofFloat(view, "y", screenHeight, (screenHeight * 0.8F));
    animator.setInterpolator(new DecelerateInterpolator());
    animator.start();
}

然后我可以这样使用它:

if (myView.getVisibility() == View.INVISIBLE) {
    myView.setVisibility(View.VISIBLE);
    animateOnScreen(myView);
}

使用ConstraintLayout添加动画

只需在可见性已更新的视图上方添加以下代码

TransitionManager.beginDelayedTransition(constraintLayout)

Note:

  • ConstraintLayout will only perform animation on its direct children since it only knows when you change layout parameters and constraints on the children that it handles.
  • ConstraintLayout only animates layout related changes.

有关更多信息,请参阅此 post https://robinhood.engineering/beautiful-animations-using-android-constraintlayout-eee5b72ecae3

这是 动画 视图 可见性 的最佳方式:

private void viewGoneAnimator(final View view) {

    view.animate()
            .alpha(0f)
            .setDuration(500)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    view.setVisibility(View.GONE);
                }
            });

}

private void viewVisibleAnimator(final View view) {

    view.animate()
            .alpha(1f)
            .setDuration(500)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    view.setVisibility(View.VISIBLE);
                }
            });

}

然后在任何你想创建视图 visiblegone 的地方调用此方法,并将预期的视图作为参数提供给方法.

只是您需要将 android:animateLayoutChanges="true" 添加到布局中。 当我将可见性设置为 linear_container 时,linear_bottom 将从下到上设置动画并取代 "linear_container"。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:animateLayoutChanges="true"
        android:orientation="vertical"
        android:layout_height="match_parent">
       <android.support.design.widget.AppBarLayout
            android:id="@+id/layoutTop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </android.support.design.widget.AppBarLayout>

       <LinearLayout
            android:id="@+id/linear_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
       </LinearLayout>
       <LinearLayout
            android:id="@+id/linear_bottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
       </LinearLayout>
</LinearLayout>