Как удалить вид, когда анимация заканчивается? - PullRequest
22 голосов
/ 11 июня 2010

Я создаю игру и хотел бы показать игроку простую анимацию «счета», когда ему начисляются кредиты. Это вид, который я выбрасываю на экран:

public class Score extends FrameLayout {

  public Score(Context context, int score) {
    super(context);
    TextView txt = new TextView(context);
    txt.setText(String.valueOf(score).toUpperCase());  
    addView(txt);
    Animation anim = AnimationUtils.loadAnimation(context, R.anim.score);
    startAnimation(anim);
    anim.setAnimationListener(animationListener);
  }
  private void Remove(){

    ViewGroup parent = (ViewGroup)getParent();  
    parent.removeView(this);

  } 
  private AnimationListener animationListener = new AnimationListener() {

    @Override
    public void onAnimationEnd(Animation animation) {

      Remove();
    }  
  };
}

Этот код на самом деле работает довольно хорошо, если в любой момент времени на экране отображается только ОДНА анимация счета. Если игрок набирает очки еще до того, как последний счет был удален, приложение вылетает - возможно, из-за того, что второе число получает событие, которое само удаляется во время анимации. Как вы, ребята, справитесь с этим?

Ответы [ 2 ]

37 голосов
/ 28 ноября 2010

Я также обнаружил, что при удалении представления от его родителя после применения анимации к этому представлению (с использованием onAnimationEnd) происходит сбой с NPE для dispatchDraw родительского элемента.

Единственное решение, которое я нашел, - вызвать удаление внутри почтового звонка. Обычно все изменения пользовательского интерфейса должны выполняться в потоке пользовательского интерфейса, поэтому я добавил в операцию вызов runOnUiThread, но он может оказаться бесполезным (без меня это работает).

Animation animation = AnimationUtils.loadAnimation(parentView.getContext(), animationId);
animation.setAnimationListener(new AnimationListener() {
    public void onAnimationStart(Animation paramAnimation) { }
    public void onAnimationRepeat(Animation paramAnimation) { }
    public void onAnimationEnd(Animation paramAnimation) { 
        // without the post method, the main UI crashes if the view is removed 
        parentView.post(new Runnable() {
            public void run() {
                // it works without the runOnUiThread, but all UI updates must 
                // be done on the UI thread
                activity.runOnUiThread(new Runnable() {
                    public void run() {
                        parentView.removeView(view);
                    }
                });
            }
        });
    }
});

view.setVisibility(visibility());
view.startAnimation(animation);
0 голосов
/ 01 марта 2018

При использовании AnimationUtils.loadAnimation view.clearAnimation() решена моя проблема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...