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动画问题——可见性变化比动画快的主要内容,如果未能解决你的问题,请参考以下文章