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

时间:2017-05-23 21:30:27

标签: android animation android-animation visibility

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

现在我需要使用此VISIBLE

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

(与SnackBar默认动画一样)

但这不起作用。它将以默认动画

变为可见

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

注意

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

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

5 个答案:

答案 0 :(得分:29)

您可以使用XML动画执行此操作。

使用slide-upXML制作set动画alpha,并将此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);
}

希望这会有所帮助〜

答案 1 :(得分:6)

使用ConstraintLayout添加动画

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

TransitionManager.beginDelayedTransition(constraintLayout)
  

注意:

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

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

答案 2 :(得分:1)

基于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);
}

答案 3 :(得分:1)

只需将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>

答案 4 :(得分:0)

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

private void viewGoneAnimator(View view) {

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

}

private void viewVisibleAnimator(View view) {

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

}

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