2012-05-25 3 views
0

Здравствуйте, я пытался сделать паузу в анимации, но не смог. С помощью переполнения стека я, по крайней мере, получил помощь анимационного endview слушателя, вот код для него. Есть ли возможный способ, где я могу приостановить анимацию вытяжку и запустить его, откуда он остановился ...AnimationDrawable Pause?

public abstract class CustomAnimationDrawable extends AnimationDrawable{ 

    /** Handles the animation callback. */ 
    Handler mAnimationHandler; 
    Runnable r= new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
       onAnimationFinish(); 
     } 
    }; 

    public CustomAnimationDrawable(AnimationDrawable aniDrawable) { 
     /* Add each frame to our animation drawable */ 
     for (int i = 0; i < aniDrawable.getNumberOfFrames(); i++) { 
      this.addFrame(aniDrawable.getFrame(i), aniDrawable.getDuration(i)); 
     } 
    } 

    @Override 
    public void start() { 
     super.start(); 
     /* 
     * Call super.start() to call the base class start animation method. 
     * Then add a handler to call onAnimationFinish() when the total 
     * duration for the animation has passed 
     */ 
     mAnimationHandler = new Handler(); 
     mAnimationHandler.postDelayed(r, getTotalDuration()); 

    } 

    /** 
    * Gets the total duration of all frames. 
    * 
    * @return The total duration. 
    */ 
    public int getTotalDuration() { 

     int iDuration = 0; 

     for (int i = 0; i < this.getNumberOfFrames(); i++) { 
      iDuration += this.getDuration(i); 
     } 

     return iDuration; 
    } 

    /** 
    * Called when the animation finishes. 
    */ 
    abstract void onAnimationFinish(); 

    public void destroy() 
    { 


     mAnimationHandler.removeCallbacksAndMessages(r); 
     mAnimationHandler.removeCallbacksAndMessages(null); 


    } 

}

Пожалуйста, помогите, пожалуйста, есть ли способ я могу остановиться?

ответ

7

Я искал вокруг, и не кажется, что есть способ сделать это прямо. Все переменные и методы для установки фрейма в AnimationDrawable являются частными. Тем не менее, вы можете получить индекс кадра, в котором включена анимация, когда вы нажимаете паузу, а затем создаете новую анимацию, итерируя через оригинальную анимацию из индекса последнего воспроизводимого кадра (а затем начинайте и добавьте остальные, если анимация является циклическим).

Я начал с цикла анимации на основе XML, а затем просто добавил еще один для паузы и возобновления. Вот что я в итоге сделал, и он работает нормально до сих пор, с соответствующими переменными, перечисленными первыми.

private ImageView sphere; 
private AnimationDrawable sphereAnimation; 
private AnimationDrawable sphereResume; 
private AnimationDrawable activeAnimation; 
private Drawable currentFrame; 
private Drawable checkFrame; 
private int frameIndex; 

private void pause() 
{ 
    looping = false; 
    sphereResume = new AnimationDrawable(); 
    activeAnimation.stop(); 
    currentFrame = activeAnimation.getCurrent(); 

    frameLoop: 
    for(int i = 0; i < sphereAnimation.getNumberOfFrames(); i++) 
    { 
     checkFrame = activeAnimation.getFrame(i); 

     if(checkFrame == currentFrame) 
     { 
      frameIndex = i; 
      for(int k = frameIndex; k < activeAnimation.getNumberOfFrames(); k++) 
      { 
       Drawable frame = activeAnimation.getFrame(k); 
       sphereResume.addFrame(frame, 50); 
      } 
      for(int k = 0; k < frameIndex; k++) 
      { 
       Drawable frame = activeAnimation.getFrame(k); 
       sphereResume.addFrame(frame, 50); 
      } 
      activeAnimation = sphereResume; 
      sphere.setImageDrawable(activeAnimation); 
      sphere.invalidate(); 
      break frameLoop; 
     } 
    } 
} 

private void play() 
{ 
    looping = false; 
    activeAnimation.setOneShot(true); 
    activeAnimation.start(); 
} 

private void stop() 
{ 
    looping = false; 
    activeAnimation.stop(); 
    activeAnimation = sphereAnimation; 
    sphere.setImageDrawable(activeAnimation); 
} 

private void loop() 
{ 
    looping = true; 
    stopSoundEffect(); 
    activeAnimation.setOneShot(false); 
    activeAnimation.start(); 
} 
+0

Работает отлично, спасибо вам большое !!! – Gustavo

+0

Не могли бы вы разместить полный код, какова ценность сферической анимации здесь? –

0

Метод Зорберт Креншоу - это Ницца, но это сложно.

У меня есть другое решение. (Нужно объединить с помощью try/catch, потому что отражение небезопасно).

можно назвать getCurFrameFromAnimationDrawable, чтобы сохранить текущий кадр до остановки анимации и вызвать setCurFrameToAnimationDrawable начать с любого кадра.

'30L' должно быть заменено вашим параметром продолжительности.

private int getCurFrameFromAnimationDrawable(AnimationDrawable drawable){ 
    try { 
     Field mCurFrame = drawable.getClass().getDeclaredField("mCurFrame"); 
     mCurFrame.setAccessible(true); 
     return mCurFrame.getInt(drawable); 
    }catch (Exception ex){ 
     Log.e(AnimTool.class.getName(), "getCurFrameFromAnimationDrawable: Exception"); 
     return 0; 
    } 
} 

private void setCurFrameToAnimationDrawable(AnimationDrawable drawable, int curFrame){ 
    try { 
     Field mCurFrame = drawable.getClass().getDeclaredField("mCurFrame"); 
     mCurFrame.setAccessible(true); 
     mCurFrame.setInt(drawable, curFrame); 
     Class[] param = new Class[]{Runnable.class, long.class}; 
     Method method = Drawable.class.getDeclaredMethod("scheduleSelf", param); 
     method.setAccessible(true); 
     method.invoke(drawable, drawable, 30L); 
    }catch (Exception ex){ 
     Log.e(AnimTool.class.getName(), "setCurFrameToAnimationDrawable: Exception"); 
    } 
} 
Смежные вопросы