Android动画问题——可见性变化比动画快

Posted

技术标签:

【中文标题】Android动画问题——可见性变化比动画快【英文标题】:Android animation problem - visibility change faster than animation 【发布时间】:2019-05-05 19:51:49 【问题描述】:

我在调整动画以更改视图的可见性时遇到问题。

我已经阅读了各种提示,但推荐的解决方案对我没有帮助。动画运行不顺畅 - 我做错了什么?

我的代码如下所示:

    childRelativeLayout.setVisibility(View.GONE);

    parentRelativeLayout.setOnClickListener(new View.OnClickListener() 
        public void onClick(View v) 
            if (childRelativeLayout.getVisibility() == View.VISIBLE) 
                Animation slide_up = AnimationUtils.loadAnimation(context, R.anim.slide_up);
                childRelativeLayout.startAnimation(slide_up);

                //-------
                childRelativeLayout.getLayoutTransition()
                        .enableTransitionType(LayoutTransition.CHANGING);
                //-------
                //OR
                //-------
                try 
                    Thread.sleep(200);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
                //-------

                childRelativeLayout.setVisibility(View.GONE);
             else 
                Animation slide_down = AnimationUtils.loadAnimation(context, R.anim.slide_down);
                childRelativeLayout.startAnimation(slide_down);

                childRelativeLayout.setVisibility(View.VISIBLE);
            
        
    );

slide_down.xml

<translate
    android:duration="200"
    android:fromYDelta="-100%"
    android:toYDelta="0" />

slide_up.xml

<translate
    android:duration="200"
    android:fromYDelta="0"
    android:toYDelta="-100%" />

【问题讨论】:

您是否尝试过更改持续时间? 200毫秒是0.2秒,是不是太快了? 【参考方案1】:

您需要删除 thread.Sleep() 并添加动画侦听器并在动画结束侦听器中设置可见性 GONE。

slide_up.setAnimationListener(new Animation.AnimationListener() 
    @Override
    public void onAnimationStart(Animation animation) 

    

    @Override
    public void onAnimationEnd(Animation animation) 
childRelativeLayout.setVisibility(View.GONE);
    

    @Override
    public void onAnimationRepeat(Animation animation) 

    
);

对于 slide_down 动画

 slide_down.setAnimationListener(new Animation.AnimationListener() 
        @Override
        public void onAnimationStart(Animation animation) 
    childRelativeLayout.setVisibility(View.VISIBLE);
        

        @Override
        public void onAnimationEnd(Animation animation) 

        

        @Override
        public void onAnimationRepeat(Animation animation) 

        
    );

【讨论】:

效果更好,因为它更流畅,但我仍然有三个问题。这是 git:gifyu.com/image/TGEZ 1. 我不知道为什么,如果视图的可见性消失了 - 单击后没有任何反应。如果我从可见视图开始,那么一切正常。 2.可见性的变化发生在与动画不同的速度(我可以接受,但仍然不完美) 3. ChildLayout动画导致视图与ParentLayout重叠 用于避免重叠减少 -100% 到 -80%。 效果更好,谢谢。如果您对剩下的问题有想法,我会很高兴听到。但一点也不差!【参考方案2】:

我使用 Kotlin,但在 Java 中看起来是一样的

val animatorSet = AnimatorSet()

val positionAnimator = ValueAnimator.ofFloat(tv.x, 0F)

positionAnimator.duration = animationDuration
positionAnimator.addUpdateListener 
   tv.x = positionAnimator.animatedValue as Float


val alphaAnimation = ValueAnimator.ofFloat(1F, 0F, 1F)

alphaAnimation.duration = animationDuration
alphaAnimation.addUpdateListener 
   tv.alpha = alphaAnimation.animatedValue as Float


animatorSet.addListener(object : AnimatorListenerAdapter() 
override fun onAnimationEnd(animation: Animator) 
   super.onAnimationEnd(animation)
   //If you need some events
   
)

positionAnimator.interpolator = AccelerateDecelerateInterpolator()
animatorSet.playTogether(positionAnimator, alphaAnimation)
animatorSet.start()

对于 JAVA。这只是一个例子。

private void animate() 
        animatorSet = new AnimatorSet();

        ValueAnimator positionAnimator = ValueAnimator.ofFloat(0, 100F);
        positionAnimator.setDuration(200);
        positionAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() 
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) 
                view.setX((Float) valueAnimator.getAnimatedValue());
            
        );

        ValueAnimator alphaAnimation = ValueAnimator.ofFloat(0f, 1F);
        positionAnimator.setDuration(200);
        positionAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() 
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) 
                view.setAlpha((Float) valueAnimator.getAnimatedValue());
            
        );

        animatorSet.addListener(new Animator.AnimatorListener() 
            @Override
            public void onAnimationStart(Animator animation, boolean isReverse) 

            

            @Override
            public void onAnimationEnd(Animator animation, boolean isReverse) 

            

            @Override
            public void onAnimationStart(Animator animator) 

            

            @Override
            public void onAnimationEnd(Animator animator) 

            

            @Override
            public void onAnimationCancel(Animator animator) 

            

            @Override
            public void onAnimationRepeat(Animator animator) 

            
        );

        positionAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); 
        animatorSet.playTogether(positionAnimator, alphaAnimation);
        animatorSet.start();
    

【讨论】:

我在 Android 上实现这个有很多问题 非常感谢,不过这次我会选择更简单的解决方案

以上是关于Android动画问题——可见性变化比动画快的主要内容,如果未能解决你的问题,请参考以下文章

当我调用可见性时,Android 动画不起作用

图片框可见性中的动画gif随委托子和后台线程而变化

Android Studio 中相对布局的动画

CSS可见性动画不起作用

绑定到可见性属性时动画不正确(奇数)

动画可见性模式,GONE 和 VISIBLE