анимация 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, прикрепленный к анимации.
это работает правильно, и больше нет никакого мерцания к концу анимации. Надеюсь, это поможет.
Я был abe, чтобы решить эту проблему, позвонив 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);
у меня была аналогичная проблема, и я использовал решение Сохама с пользовательским классом представления.
он работал нормально, но в конце концов я нашел более простое решение, которое сработало для меня.
после вызова 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 (мерцание): a) перемещение изображения из 0px в 80px b) в onAnimationEnd установите местоположение изображения в 80px
Попытка 2 (без мерцания): a) в onAnimationStart установите местоположение изображения в 80px b) переместить изображение из-80px в 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
}
}