Android анимация не закончена в onAnimationEnd
кажется, что анимация android на самом деле не закончена, когда onAnimationEnd событие срабатывает, хотя animation.hasEnded имеет значение true.
Я хочу, чтобы мой взгляд, чтобы изменить его фон drawable на конце его ScaleAnimation что он делает, но вы можете ясно видеть, что он изменяется за несколько миллисекунд до его завершения. Проблема в том, что он мерцает, потому что новый фон появляется (=is) масштабируется в течение короткого времени, пока анимация действительно не закончится.
есть ли способ получите либо реальный конец анимации, либо просто предотвратите масштабирование нового фона за этот короткий период времени?
спасибо!
/ / EDIT: я использую AnimationListener чтобы получить следующий вызов:
@Override
public void onAnimationEnd(Animation animation)
{
View view = (MyView) ((ExtendedScaleAnimation) animation).getView();
view.clearAnimation();
view.requestLayout();
view.refreshBackground(); // <-- this is where the background gets changed
}
11 ответов:
вот фактическая ошибка, связанная с этой проблемой http://code.google.com/p/android-misc-widgets/issues/detail?id=8
это в основном говорит о том, что метод onAnimationEnd на самом деле не работает хорошо, когда AnimationListener прикреплен к анимации
обходной путь заключается в прослушивании событий анимации в представлении, к которому вы применяли анимацию Например, если изначально вы прикрепляли прослушиватель анимации к анимации вот так
mAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation arg0) { //Functionality here } });а затем применить к анимации к ImageView, как это
mImageView.startAnimation(mAnimation);чтобы обойти эту проблему, теперь необходимо создать пользовательский ImageView
public class MyImageView extends ImageView {а затем переопределить
onAnimationEndметод класса View и предоставить все функциональные возможности там@Override protected void onAnimationEnd() { super.onAnimationEnd(); //Functionality here }это правильное решение для этой проблемы, предоставьте функциональность в over-riden View - > onanimationend метод в отличие от onAnimationEnd метод AnimationListener прилагается к анимации.
это работает правильно, и больше нет никакого мерцания к концу анимации. Надеюсь, это поможет.
Я был Эйб, чтобы решить эту проблему, позвонив clearAnimation() на вид анимируется внутри onAnimationEnd, что убрал мерцание Это странно, почему кто-то должен это делать, так как обратный вызов onAnimationEnd должен был быть вызван только в том случае, если анимация уже закончилась. Но я думаю, что ответ лежит в глубине структуры о том, как view/layout обрабатывает обратный вызов анимации. На данный момент возьмите его как халтурное решение, которое просто работает.
animation.setAnimationListener(new AnimationListener() { public void onAnimationEnd(Animation anim) { innerView.clearAnimation(); // to get rid of flicker at end of animation RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams (innerBlockContainer.getWidth(), innerBlockContainer.getHeight()); /* Update lp margin, left/top to update layout after end of Translation */ ViewGroup parent_ofInnerView = (ViewGroup)innerView.getParent(); vp.updateViewLayout(innerBlockContainer, lp); } public void onAnimationRepeat(Animation arg0) {} public void onAnimationStart(Animation arg0) { } }); innerView.startAnimation(animation);
у меня была аналогичная проблема, и я использовал решение Soham с пользовательским классом представления.
он работал нормально, но в конце концов, я нашел более простое решение, которое сработало для меня.
после вызова
view.StartAnimation(animation), и перед следующим шагом в моей программе я добавил небольшую задержку, которая будет достаточно длинной, чтобы анимация закончилась, но достаточно короткой, чтобы быть незаметной для пользователя:new Handler().postDelayed(new Runnable() { @Override public void run() { nextStepInMyProgram(); } }, 200);// delay in milliseconds (200)
у меня была такая же проблема, и я решил ее с помощью
view.clearAnimation();до
view.startAnimation(anim);
по какой-то причине onAnimationStart работает правильно, а onAnimationEnd-нет. Так вот как я изначально это сделал и что я изменил:
Попытка 1 (мерцание): а) перемещение изображения от 0px до 80 пикселей Б) В onAnimationEnd, задать расположение рисунка на 80 пикселей
Попытка 2 (без мерцания): а) в onAnimationStart, задать расположение рисунка на 80 пикселей б) перемещение изображения от -80 пикселей, чтобы 0px
надеюсь, что это имело смысл. В основном я перевернул так, как я это сделал
попробуйте использовать getAnimation () из вашего объекта:
public void onShowListBtnClick(View view) { rightPanel.startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.slide_left)); rightPanel.getAnimation().setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // write your code here } }); }
легко исправить, чтобы добавить одну строку в
AnimationListener.onAnimationEnd():@Override public void onAnimationEnd(Animation a) { a.setAnimationListener(null); … }
annimation можно также остановить на вращении экрана. в этом случае onAnimationEnd() не вызывается. мой обходной путь:
animation.setDuration(animationDuration); animation.setAnimationListener(new AnimationListenerAdapter() {...}); view.startAnimation(animation); handler.postDelayed(new Runnable() { @Override public void run() { if(!animation.hasEnded()) { // here you can handle this case } } }, animationDuration + 100);
у меня была эта проблема, потому что мой
Animationне был запущен в главном потоке. Это привело кdurationна 0. Тем не менее,Animationиграли правильно - это просто называетсяonAnimationEnd()сразу после выполнения.
Если вы используете счетчик повторов как бесконечный, то onAnimationEnd не будет вызван. Проверьте документацию ссылке
это сработало для меня:
@Override public void onAnimationUpdate(ValueAnimator animation) { if (Float.compare(animation.getAnimatedFraction(),1.0f)) { // animation ended; //do stuff post animation } }
Comments