2012-11-18 46 views
0
public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.genie_out); 



     genie = (ImageView) findViewById(R.id.genieout); 
     startService(new Intent(this, MyService2.class)); 
     SceneAnimation come = new SceneAnimation(genie, comingout,  durationcomingout); 
     SceneAnimation circled = new SceneAnimation(genie, circle,durationcircle); 

     come.play(1); 



     circled.play(1); 


    } 

有一个ImageView,它需要整个屏幕,我想知道如何等待come.play(1)完成播放circle.play(1),就像这个圆圈先播放然后播放,因为来的剩下的部分是一个较长的动画,我想也知道这一点,因为我有更多的服务,我想开始也跟着他们的方式停止,感谢您的时间等待ImageView中的一个动画停止启动另一个动画?

class SceneAnimation { 
public int x; 
public ImageView mImageView; 
public int[] mFrameRess; 
public int[] mDurations; 
public int mDuration; 

public int mLastFrameNo; 
public long mBreakDelay; 


public SceneAnimation(ImageView pImageView, int[] pFrameRess, int[] pDurations) 
{ 

    mImageView = pImageView; 
    mFrameRess = pFrameRess; 
    mDurations = pDurations; 
    mLastFrameNo = pFrameRess.length - 1; 

    play(1); 
} 

public SceneAnimation(ImageView pImageView, int[] pFrameRess, int pDuration){ 
    mImageView = pImageView; 
    mFrameRess = pFrameRess; 
    mDuration = pDuration; 
    mLastFrameNo = pFrameRess.length - 1; 

    mImageView.setImageResource(mFrameRess[0]); 

    playConstant(1); 
} 

public SceneAnimation(ImageView pImageView, int[] pFrameRess, int pDuration, long pBreakDelay){    
    mImageView = pImageView; 
    mFrameRess = pFrameRess; 
    mDuration = pDuration; 
    mLastFrameNo = pFrameRess.length - 1; 
    mBreakDelay = pBreakDelay; 

    mImageView.setImageResource(mFrameRess[0]); 
    playConstant(1); 
} 


    public void play(final int pFrameNo) 
{ 


    mImageView.postDelayed(new Runnable(){ 
     public void run() { 


      mImageView.setImageResource(mFrameRess[pFrameNo]); 
      if(pFrameNo == mLastFrameNo) 
       { 
       return;} 
      else 
       play(pFrameNo + 1); 
     } 
    }, mDurations[pFrameNo]); 
} 


public void playConstant(final int pFrameNo){ 
    mImageView.postDelayed(new Runnable(){ 
     public void run() {      
      mImageView.setImageResource(mFrameRess[pFrameNo]); 

      if(pFrameNo == mLastFrameNo) 
       playConstant(0); 
      else 
       playConstant(pFrameNo + 1); 
     } 
    }, pFrameNo==mLastFrameNo && mBreakDelay>0 ? mBreakDelay : mDuration); 
} 



}; 
+0

你可能应该使用'AnimationListener'。将animtionlistener设置为第一个动画,并在'onAnimationEnd'开始第二个动画。 – Wenhui

+0

它不是一个动画类AnimationListener不知道什么时候结束,生病把代码放到SceneAnimation中我不知道如何让AnimationListener通过类运行,也许你可以帮助 – JRowan

+0

我可能是错的,但是SceneAnimation看起来像Frame Animation 。你有没有考虑过使用['AnimationDrawable'](http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html),它支持逐帧动画。否则,您可以提供您自己的动画侦听器。我将在下面发布答案。 – Wenhui

回答

1

这里一种方式实现自己的AnimationListener

package com.example.intentfiletersample; 

import android.widget.ImageView; 

class SceneAnimation { 
public int x; 
public ImageView mImageView; 
public int[] mFrameRess; 
public int[] mDurations; 
public int mDuration; 

public int mLastFrameNo; 
public long mBreakDelay; 

private AnimationListener mAnimationListener; 

public SceneAnimation(ImageView pImageView, int[] pFrameRess, int[] pDurations) { 

    mImageView = pImageView; 
    mFrameRess = pFrameRess; 
    mDurations = pDurations; 
    mLastFrameNo = pFrameRess.length - 1; 

    play(1); 
} 

public SceneAnimation(ImageView pImageView, int[] pFrameRess, int pDuration) { 
    mImageView = pImageView; 
    mFrameRess = pFrameRess; 
    mDuration = pDuration; 
    mLastFrameNo = pFrameRess.length - 1; 

    mImageView.setImageResource(mFrameRess[0]); 

    playConstant(1); 
} 

public SceneAnimation(ImageView pImageView, int[] pFrameRess, int pDuration, long pBreakDelay) { 
    mImageView = pImageView; 
    mFrameRess = pFrameRess; 
    mDuration = pDuration; 
    mLastFrameNo = pFrameRess.length - 1; 
    mBreakDelay = pBreakDelay; 

    mImageView.setImageResource(mFrameRess[0]); 
    playConstant(1); 
} 

public void setAnimationListener(AnimationListener listener){ 
    this.mAnimationListener = listener; 
} 

public void play(final int pFrameNo) { 

    mImageView.postDelayed(new Runnable() { 
     public void run() { 

      mImageView.setImageResource(mFrameRess[pFrameNo]); 
      if (pFrameNo == mLastFrameNo) { 
       return; 
      } else 
       play(pFrameNo + 1); 

      // Callback when animation ends. 
      if(mAnimationListener != null){ 
       mAnimationListener.onAnimationEnd(); 
      } 
     } 
    }, mDurations[pFrameNo]); 
} 

public void playConstant(final int pFrameNo) { 
    mImageView.postDelayed(new Runnable() { 
     public void run() { 
      mImageView.setImageResource(mFrameRess[pFrameNo]); 

      if (pFrameNo == mLastFrameNo) 
       playConstant(0); 
      else 
       playConstant(pFrameNo + 1); 

      // Callback when animation ends. 
      if(mAnimationListener != null){ 
       mAnimationListener.onAnimationEnd(); 
      } 
     } 
    }, pFrameNo == mLastFrameNo && mBreakDelay > 0 ? mBreakDelay : mDuration); 
} 


public static interface AnimationListener { 
    public void onAnimationEnd(); 
    // You can add onAnimationStart(), and do the same thing like onAnimationEnd. 
} 
}; 

总是建议您首先浏览Android SDK附带的Animation API,在实现自己的SDK之前查看是否适合您。

希望这能帮到你。

+0

谢谢你这是我寻找的解决方案,我没有尝试,但即时去现在,我不得不使这个类,因为animationdrawable保持超过虚拟机预算我有大约80个全帧,我即将gona现在尝试 – JRowan

+0

你保存我从过去的48小时直接研究一个解决方案,非常感谢你,你使用!= null来设置onAnimationRepeat()?再次感谢你,即将去删除我所有关于此问题的其他问题现在,这是我第一次设置AnimationListener – JRowan

+1

我很高兴这对你有用。当您使用AniamtionDrawable并获取OOM错误时,您的代码可能有问题。检查'mAnimation!= null'以避免NPE总是很好的习惯,你可以对'onAimationRepeat()'做同样的事情,只要把调用放到适当的地方即可。 – Wenhui

相关问题