2015-03-19 59 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)); 
    } 
}