Android ViewPropertyAnimator意外循环

Android ViewPropertyAnimator意外循环,android,animation,Android,Animation,我正在尝试设置一组按钮的动画,使它们在单击时依次消失,然后根据单击的按钮执行操作。动作被指定给动画监听器,该监听器在动画结束时触发。这个很好用 问题是,我希望在活动恢复时按钮会依次重新出现。由于某些原因,即使在将动画设置为null之后,指定给动画侦听器的操作也会重新触发。我错过了什么 public class MainMenu extends ActionBarActivity { private MenuItemBuilder menuItemBuilder; @Override prot

我正在尝试设置一组按钮的动画,使它们在单击时依次消失,然后根据单击的按钮执行操作。动作被指定给动画监听器,该监听器在动画结束时触发。这个很好用

问题是,我希望在活动恢复时按钮会依次重新出现。由于某些原因,即使在将动画设置为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
}
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));
    }
}
public菜单编辑器(上下文){
this.context=上下文;
init();
}
私有void init(){
initLoadDatabase();
initPriceList();
initAbout();
}
私有视图getViewFromId(int-res){
返回((活动)上下文);
}
私有ImageButton getImageButtonFromId(int-res){
返回(ImageButton)((活动)上下文);
}
私有void initLoadDatabase(){
最终ImageButton=getImageButtonFromId(R.id.imageLoadDatabase);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
animateAllViewsExit(ButtonType.LOAD_数据库);
}
});
}
private void initPriceList(){
最终图像按钮=getImageButtonFromId(R.id.imagePriceList);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
animateAllViewsExit(按钮类型.价格列表);
}
});
}
私有void initAbout(){
最终图像按钮=getImageButtonFromId(R.id.imageAbout);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
animateAllViewsExit(ButtonType.ABOUT);
}
});
}
私有列表getAnimatedViews(){
List viewList=新建ArrayList();
add(getViewFromId(R.id.imageLoadDatabase));
add(getViewFromId(R.id.priceListContainer));
add(getViewFromId(R.id.imageAbout));
返回视图列表;
}
public void animateAllViewsEnter(){
列表视图列表=getAnimatedViews();
对于(int i=0;i
通过将侦听器设置为输入和退出动画,修复了此问题

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
}
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));
    }
}
public void animateAllViewsEnter(){
列表视图列表=getAnimatedViews();
对于(int i=0;i