У меня проблема с настройкой анимации для изменения видимости представления.
Я читал о различных советах, но рекомендуемые решения мне не помогают. Анимация работает не плавно - что я делаю не так?
Мой код выглядит так:
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%" />




вам нужно удалить 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.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%.
работает намного лучше, спасибо. Если бы у вас была идея по поводу оставшихся проблем, я был бы рад услышать. Но это совсем не плохо!
Я использую 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
спасибо большое, но на этот раз я выберу более простое решение
вы пробовали изменить продолжительность? 200 миллисекунд - это 0,2 секунды, разве это не слишком быстро?