Подтвердить что ты не робот

Как удалить представление, когда заканчивается анимация?

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

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();
    }  
  };
}

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

4b9b3361

Ответ 1

Я также обнаружил, что при удалении представления из его родителя после применения анимации к этому представлению (с использованием 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);