【问题标题】: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());

【问题讨论】:

    标签: android animation android-animation visibility


    【解决方案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_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>
    

    【讨论】:

    • 非常感谢您,这对我来说是最好的答案!
    【解决方案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 这里有同样的问题,你找到解决办法了吗?
      猜你喜欢
      • 2014-10-05
      • 2019-08-17
      • 2015-12-12
      • 1970-01-01
      • 2015-02-25
      • 2015-04-17
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多