通过动画将视图的可见性设置为可见的可见性

Das*_*all 17 animation android visibility android-animation

我有一个invisible默认的视图(只是第一次).

现在我需要的可视性切换到VISIBLE与此animation:

if (myView.getVisibility() == View.INVISIBLE) {
    myView.setVisibility(View.VISIBLE);
    myView.animate().translationY(0);
 }
Run Code Online (Sandbox Code Playgroud)

(就像SnackBar默认动画一样)

但这不起作用.它将使用默认动画变为可见

有什么简单的方法可以达到这个目的吗?

注意

我想要解雇我的观点,就像这样:

myView.animate().translationY(myView.getHeight());
Run Code Online (Sandbox Code Playgroud)

Fer*_*med 30

你可以使用XML动画做到这一点.

使用和创建slide-up动画并将其放入资源文件夹中.XMLsetalphaXMLanim

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>
Run Code Online (Sandbox Code Playgroud)

使用:

用于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);
}
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助〜


Ris*_*esh 9

使用ConstraintLayout添加动画

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

TransitionManager.beginDelayedTransition(constraintLayout)
Run Code Online (Sandbox Code Playgroud)

注意:

  • ConstraintLayout将仅在其直接子代上执行动画,因为它仅知道何时更改其处理的子代上的布局参数和约束。
  • ConstraintLayout仅对与布局相关的更改设置动画。

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


Par*_*rSa 9

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

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(VISIBLE);
                }
            });

}
Run Code Online (Sandbox Code Playgroud)

然后在您想让视图可见消失的任何地方调用此方法,并将预期视图作为参数提供给方法。

  • 解决此问题的方法是使用“viewVisibleAnimator”的“onAnimationStart()”回调 (2认同)

小智 8

只是您需要添加android:animateLayoutChanges="true"到您的布局中。当我将可见性设置为 时linear_containerlinear_bottom将从下到上进行动画处理并取代“线性容器”。

<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>
Run Code Online (Sandbox Code Playgroud)