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