Искал способ побороть мерцание в конце анимации, нашёл случайно на stackoverflow.
Суть такая:
у меня есть view, который мне нужно сдвинуть вниз на величину height. Для отображения такого сдвига я использую TranslateAnimation.
После окончания работы animation я устанавливаю значение marginTop для сдвинутого view - чтобы "закрепить" его в новом положении.
Проблема: после окончания движения view происходит "мерцание" - или перерисовка - сдвигаемого объекта.
Как решить: в методе слушателя onAnimationEnd принудительно остановить выполнение анимации вызовом метода view.clearAnimation.
Вот как это выглядит:
private void animateMoveDown(final View view, final int height) {
Animation animation = new TranslateAnimation(
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, height);
animation.setDuration(500);
animation.setInterpolator(new LinearInterpolator());
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) { }
@Override
public void onAnimationRepeat(Animation animation) { }
@Override
public void onAnimationEnd(Animation animation) {
view.clearAnimation();
MarginLayoutParams mparams = (MarginLayoutParams) view.getLayoutParams();
mparams.setMargins(0, height, 0, 0);
view.setLayoutParams(mparams);
}
});
view.startAnimation(animation);
}
Суть такая:
у меня есть view, который мне нужно сдвинуть вниз на величину height. Для отображения такого сдвига я использую TranslateAnimation.
После окончания работы animation я устанавливаю значение marginTop для сдвинутого view - чтобы "закрепить" его в новом положении.
Проблема: после окончания движения view происходит "мерцание" - или перерисовка - сдвигаемого объекта.
Как решить: в методе слушателя onAnimationEnd принудительно остановить выполнение анимации вызовом метода view.clearAnimation.
Вот как это выглядит:
private void animateMoveDown(final View view, final int height) {
Animation animation = new TranslateAnimation(
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, height);
animation.setDuration(500);
animation.setInterpolator(new LinearInterpolator());
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) { }
@Override
public void onAnimationRepeat(Animation animation) { }
@Override
public void onAnimationEnd(Animation animation) {
view.clearAnimation();
MarginLayoutParams mparams = (MarginLayoutParams) view.getLayoutParams();
mparams.setMargins(0, height, 0, 0);
view.setLayoutParams(mparams);
}
});
view.startAnimation(animation);
}
Комментариев нет:
Отправить комментарий