2012-02-21 5 views
1

У меня большие проблемы с анимацией, используя AnimationSet. Я хочу сделать следующую анимацию:Почему AnimationSet не выполняет анимацию?

Увеличьте от 0 до 100%, затем перейдите от A к B и в то же время альфа от 1,0 до 0,5 и от 0,5 до 1,0.

У меня есть несколько вопросов, с этой последовательностью, но два мажоры:

  • Несмотря на то, что я вычислить начальное смещение и продолжительность каждой анимации должным образом, шаг анимация заканчивается, и я до сих пор при альфа-0,5, поэтому он увеличивается до 1,0 один раз в позиции B.

  • Иногда альфа-анимация не достигает 1.0, похоже, что она останавливается на 0,9 или достигает 1,0, а когда экран перерисовывается и отображается на 0,9 ,

Насколько я знаю, AnimatorSet оценивает анимацию последовательно, но с помощью startOffset он может запускать их параллельно.

Вот часть моего кода:

public void moveAndDrawPart(ImageView partToMove, Button buttonPressed) 
    { 
     // Save current data for listener. 
     lastPartToMove = partToMove; 
     lastButtonPressed = buttonPressed; 

     // Animate part movement. 
     animatePart(partToMove, buttonPressed); 
    } 

    // Animate part movement from original position to the final position. 
    private void animatePart(ImageView part, Button destination) 
    { 
     // Make part visible. 
     part.setVisibility(ImageView.VISIBLE); 
     part.bringToFront(); 

     AnimationSet animator = new AnimationSet(false); 
     animator.setFillAfter(false); 

     // Make part appears by scaling up. 
     ScaleAnimation scaleUp = new ScaleAnimation((float)0.0, (float)1.0, (float)0.0, (float)1.0, ScaleAnimation.RELATIVE_TO_SELF, (float)0.5, ScaleAnimation.RELATIVE_TO_SELF, (float)0.5); 
     scaleUp.setInterpolator(new DecelerateInterpolator()); 
     scaleUp.setFillAfter(true); 
     scaleUp.setStartOffset(0); 
     scaleUp.setDuration(500);  

     // Move from origin to final position. 
     TranslateAnimation move = new TranslateAnimation(0, destination.getX()-part.getX(), 0, destination.getY()-part.getY()); 
     move.setInterpolator(new DecelerateInterpolator()); 
     move.setFillAfter(true); 
     move.setStartOffset(scaleUp.getDuration()); 
     move.setDuration(600); 

     // Make part semi-transparent. 
     AlphaAnimation alpha = new AlphaAnimation((float)1.0, (float)0.5); 
     alpha.setInterpolator(new LinearInterpolator()); 
     alpha.setFillAfter(true); 
     alpha.setRepeatCount(1); 
     alpha.setRepeatMode(AlphaAnimation.REVERSE); 
     alpha.setStartOffset(scaleUp.getDuration()); 
     alpha.setDuration(300); 

     animator.addAnimation(scaleUp); 
     animator.addAnimation(move); 
     animator.addAnimation(alpha); 
     animator.setAnimationListener(this); 

     part.startAnimation(animator); 
    } 

    // Reposition part at final position to redraw it properly. 
    private void repositionPart(ImageView part, Button destination) 
    { 
     // Clear part animation to bring back drawn position to original. 
     part.clearAnimation(); 

     part.setX(destination.getX()); 
     part.setY(destination.getY()); 
    } 

    public void onAnimationStart(Animation animation) 
    { 
     // This variable is used to workaround a glitch: clearAnimation() 
     // causes onAnimationEnd() to be called twice. 
     animationDone = false; 
    } 

    public void onAnimationEnd(Animation animation) 
    { 
     // This variable is used to workaround a glitch: clearAnimation() 
     // causes onAnimationEnd() to be called twice. 
     if(animationDone == false) 
     { 
     animationDone = true; 

     if((lastPartToMove != null) && (lastButtonPressed != null)) 
     { 
      // Reposition the part. 
      repositionPart(lastPartToMove, lastButtonPressed); 
     } 
     else 
     { 
      Toast.makeText(myAct, "Major error occured. Last references are not set!", Toast.LENGTH_LONG).show(); 
     } 
     } 
    } 

Не могли бы вы сказать мне, почему AnimationSet не делать то, что я ожидал?

Кстати, я экспериментирую с этой проблемой с эмулятором Honeycomb 3.2.

+0

Что касается альфы, которая когда-то не достигает 1.0 в конце анимации. Я тестировал его на устройстве и получил тот же результат, пока не активирую аппаратное ускорение в своем приложении. Отныне альфа, кажется, всегда достигает 1.0. Тем не менее, я все еще получаю странное поведение на эмуляторе. – DavidH

+0

У кого-нибудь есть шанс попробовать мой код и посмотреть, не глючит ли он? – DavidH

ответ

0

После создания анимации или анимации вы должны загрузить его в класс вида вида, например «Макет». то вы можете оживить этот макет так:

TranslateAnimation trans = new TranslateAnimation(0, 0, 0, height/2); 
     trans.setDuration(1000); 


     myAnimationSet.addAnimation(trans); 

     final RelativeLayout splash_relative = (RelativeLayout) findViewById(R.id.relativeLayout_splash); 
     splash_relative.startAnimation(myAnimationSet); 

и она работает. Надеюсь, это поможет.

Смежные вопросы