2015-03-19 2 views
0

Я пытаюсь анимировать набор кнопок, чтобы они исчезали последовательно по клику, а затем выполняет действие, основанное на нажатой кнопке. Действие назначается слушателю анимации, который запускается на конце анимации. Это прекрасно работает.ViewPropertyAnimator петли неожиданно

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

public class MainMenu extends ActionBarActivity { 

private MenuItemBuilder menuItemBuilder; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main_menu); 

    init(); 
} 

private void init() { 
    menuItemBuilder = new MenuItemBuilder(this); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    if (menuItemBuilder != null) { 
     menuItemBuilder.animateAllViewsEnter(); 
    } 
} 

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

public MenuItemBuilder(Context context) { 
    this.context = context; 

    init(); 
} 

private void init() { 
    initLoadDatabase(); 
    initPriceList(); 
    initAbout(); 
} 

private View getViewFromId(int res) { 
    return ((Activity) context).findViewById(res); 
} 

private ImageButton getImageButtonFromId(int res) { 
    return (ImageButton) ((Activity) context).findViewById(res); 
} 

private void initLoadDatabase() { 
    final ImageButton button = getImageButtonFromId(R.id.imageLoadDatabase); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      animateAllViewsExit(ButtonType.LOAD_DATABASE); 
     } 
    }); 
} 

private void initPriceList() { 
    final ImageButton button = getImageButtonFromId(R.id.imagePriceList); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      animateAllViewsExit(ButtonType.PRICE_LIST); 
     } 
    }); 
} 

private void initAbout() { 
    final ImageButton button = getImageButtonFromId(R.id.imageAbout); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      animateAllViewsExit(ButtonType.ABOUT); 
     } 
    }); 
} 

private List<View> getAnimatedViews() { 
    List<View> viewList = new ArrayList<>(); 
    viewList.add(getViewFromId(R.id.imageLoadDatabase)); 
    viewList.add(getViewFromId(R.id.priceListContainer)); 
    viewList.add(getViewFromId(R.id.imageAbout)); 

    return viewList; 
} 

public void animateAllViewsEnter() { 
    List<View> viewList = getAnimatedViews(); 
    for (int i = 0; i < viewList.size(); i++) { 
     View view = viewList.get(i); 
     view.animate() 
       .setStartDelay((viewList.size() - i) * 250) 
       .alpha(1.0f); 
    } 
} 

private void animateAllViewsExit(ButtonType buttonType) { 
    List<View> viewList = getAnimatedViews(); 
    for (int i = 0; i < viewList.size(); i++) { 
     View view = viewList.get(i); 
     ViewPropertyAnimator animator = view.animate() 
       .setStartDelay(i * 250) 
       .alpha(0.0f); 

     if (i == viewList.size() - 1) { 
      lastAnimation = animator; 
     } 
    } 

    setAnimationAction(buttonType); 
} 

private void setAnimationAction(final ButtonType buttonType) { 
    if (lastAnimation != null) { 
     lastAnimation.setListener(new Animator.AnimatorListener() { 
      @Override 
      public void onAnimationStart(Animator animation) { 
      } 

      @Override 
      public void onAnimationEnd(Animator animation) { 
       performAction(buttonType); 
       lastAnimation = null; 
      } 

      @Override 
      public void onAnimationCancel(Animator animation) { 
      } 

      @Override 
      public void onAnimationRepeat(Animator animation) { 
      } 
     }); 
    } 
} 

private void performAction(ButtonType buttonType) { 
    switch (buttonType) { 
     case LOAD_DATABASE: 
      // TODO to be done 
      break; 
     case PRICE_LIST: 
      context.startActivity(new Intent(context, PriceList.class)); 
      break; 
     case ABOUT: 
      context.startActivity(new Intent(context, About.class)); 
      break; 
    } 
} 

private enum ButtonType { 
    LOAD_DATABASE, 
    PRICE_LIST, 
    ABOUT 
} 

ответ

0

Исправлено, устанавливая слушателя как для входа, так и для выхода из анимации.

public void animateAllViewsEnter() { 
    List<View> viewList = getAnimatedViews(); 
    for (int i = 0; i < viewList.size(); i++) { 
     View view = viewList.get(i); 
     view.animate() 
       .setStartDelay((viewList.size() - i) * 250) 
       .alpha(1.0f) 
       .setListener(null); 
    } 
} 

private void animateAllViewsExit(ButtonType buttonType) { 
    List<View> viewList = getAnimatedViews(); 
    for (int i = 0; i < viewList.size(); i++) { 
     viewList.get(i).animate() 
       .setStartDelay(i * 250) 
       .alpha(0.0f) 
       .setListener(getAnimatorListener(i == viewList.size() - 1, buttonType)); 
    } 
} 
Смежные вопросы