首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewPropertyAnimator意外循环

ViewPropertyAnimator意外循环
EN

Stack Overflow用户
提问于 2015-03-19 14:25:58
回答 1查看 128关注 0票数 0

我正在尝试设置一组按钮的动画,使它们在单击时按顺序消失,然后根据单击的按钮执行操作。该操作被分配给在动画结束时触发的动画侦听器。这可以很好地工作。

问题是,当活动恢复时,我希望按钮按顺序重新出现。由于某些原因,即使在将动画设置为空之后,分配给动画侦听器的操作也会重新触发。我遗漏了什么?

代码语言:javascript
复制
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();
    }
}

下面是菜单构建器。我有三个菜单项:加载数据库,价目表和关于。这个类管理所有的动画。

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

发布于 2015-03-19 17:27:23

通过将侦听器设置为进入和退出动画,修复了此问题。

代码语言:javascript
复制
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));
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29138393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档