среда, сентября 26, 2012

Как убрать мерцание в конце анимации

Искал способ побороть мерцание в конце анимации, нашёл случайно на 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);
}