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

Posted

技术标签:

【中文标题】使用动画将视图的可见性从消失变为可见【英文标题】:Animate visibility of a view from gone to visible with animation 【发布时间】:2017-10-24 00:42:39 【问题描述】:

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

现在我需要用这个animation 将可见性切换到VISIBLE

if (myView.getVisibility() == View.INVISIBLE) 
    myView.setVisibility(View.VISIBLE);
    myView.animate().translationY(0);
 

(和 SnackBar 默认动画一样)

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

有什么简单的方法可以实现吗?

注意

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

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

【问题讨论】:

【参考方案1】:

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

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);
                
            );


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

【讨论】:

嘿,如果让它可见,它不会动画:(我使用了上面提到的相同方法。 解决此问题的方法是使用 onAnimationStart()callback 为 viewVisibleAnimator【参考方案2】:

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

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

       <LinearLayout
            android:id="@+id/linear_container"
            android:layout_
            android:layout_
       </LinearLayout>
       <LinearLayout
            android:id="@+id/linear_bottom"
            android:layout_
            android:layout_
       </LinearLayout>
</LinearLayout>

【讨论】:

非常感谢您,这对我来说是最好的答案!【参考方案3】:

基于this 答案:

使用这种方法,我可以将我的视图的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);

【讨论】:

【参考方案4】:

使用 ConstraintLayout 添加动画

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

TransitionManager.beginDelayedTransition(constraintLayout)

注意:

ConstraintLayout 只会在其直接子级上执行动画,因为它只知道您何时更改布局参数和对它处理的子级的约束。 ConstraintLayout 仅对与布局相关的更改进行动画处理。

更多信息请看这篇帖子https://robinhood.engineering/beautiful-animations-using-android-constraintlayout-eee5b72ecae3

【讨论】:

这个选项很有趣,它甚至可以更快地更新recycleView,即使我已经在另一个布局上实现了它。【参考方案5】:

您可以使用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);

希望对你有帮助~

【讨论】:

我已经更新了我的答案。它现在显示像小吃店一样的上滑动画 感谢您的回复,您的解决方案也很有效,我会接受它,因为它对我来说看起来更干净。 很高兴知道这一点。如果我的回答看起来有用,请点赞。提前致谢 感谢您的解决方案,当我试图使视图消失时,我想做确切的事情,但它不起作用,并且一次不可见视图,我应该做些什么这个位置有什么不同? 嘿@ArashAfsharpour 这里有同样的问题,你找到解决办法了吗?

以上是关于使用动画将视图的可见性从消失变为可见的主要内容,如果未能解决你的问题,请参考以下文章

为膨胀的布局设置视图的可见性消失

Android 中的可见性消失

CSS可见性动画不起作用

更新列表视图中的单行以显示隐藏的文本视图

如何保存可见性android

如何设置滚动视图内并包含两个 TextView 的线性布局的可见性消失?