我正在尝试设置一组按钮的动画,使它们在单击时按顺序消失,然后根据单击的按钮执行操作。该操作被分配给在动画结束时触发的动画侦听器。这可以很好地工作。
问题是,当活动恢复时,我希望按钮按顺序重新出现。由于某些原因,即使在将动画设置为空之后,分配给动画侦听器的操作也会重新触发。我遗漏了什么?
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
}发布于 2015-03-19 17:27:23
通过将侦听器设置为进入和退出动画,修复了此问题。
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));
}
}https://stackoverflow.com/questions/29138393
复制相似问题