2012-04-04 106 views
2

我正在使用翻譯動畫來移動ImageView。我使用此代碼:暫停和恢復翻譯動畫

TranslateAnimation set1 = new TranslateAnimation(-4, 10, -110, 0); 
     set1.setDuration(3000); 
     TranslateAnimation set2 = new TranslateAnimation(10, -3, 0, 115); 
     set2.setDuration(3000); 
     set2.setStartOffset(2200); 
     TranslateAnimation set3 = new TranslateAnimation(-3, -20, 0, -100); 
     set3.setDuration(3000); 
     set3.setStartOffset(4500); 
     TranslateAnimation set4 = new TranslateAnimation(0, 13, 0, -120); 
     set4.setDuration(3000); 
     set4.setStartOffset(6500); 

     animSet.addAnimation(set1); 
     animSet.addAnimation(set2); 
     animSet.addAnimation(set3); 
     animSet.addAnimation(set4); 

     animSet.setFillAfter(true); 

創建一組動畫後,我申請他們在ImageView這樣的:

image = (ImageView)findViewById(R.id.img); 
     image.startAnimation(animSet); 

一切工作正常,但我不能暫停動畫和簡歷點擊按鈕點擊

我該怎麼做?

我嘗試了一切,但沒有成功。任何想法如何做到這一點?

請幫忙!

回答

7

找了一段時間後,我發現這個link和檢查是否適用於翻譯動畫或不是,經過一些修改後,這也適用於您的動畫。

瞭解改下面的代碼:

public class TranslateAnim extends TranslateAnimation{ 

    public TranslateAnim(float fromXDelta, float toXDelta, float fromYDelta, 
      float toYDelta) { 
     super(fromXDelta, toXDelta, fromYDelta, toYDelta); 
     // TODO Auto-generated constructor stub 
    } 

    private long mElapsedAtPause=0; 
    private boolean mPaused=false; 

    @Override 
    public boolean getTransformation(long currentTime, Transformation outTransformation) { 
     if(mPaused && mElapsedAtPause==0) { 
      mElapsedAtPause=currentTime-getStartTime(); 
     } 
     if(mPaused) 
      setStartTime(currentTime-mElapsedAtPause); 
     return super.getTransformation(currentTime, outTransformation); 
    } 

    public void pause() { 
     mElapsedAtPause=0; 
     mPaused=true; 
    } 

    public void resume() { 
     mPaused=false; 
    } 
} 

我只改變類名,擴展類名和這個類的構造函數。

你可以用它喜歡:

TranslateAnim set1, set2, set3, set4; // objects of TranslateAnim Class 

set1 = new TranslateAnim(-4, 10, -110, 0); // initialize all objects like this way 

animSet.addAnimation(set1); // add all animation objests in your animation set as you do before 

animSet.setFillAfter(true); 

,開始你的動畫之後,你只叫暫停和恢復方法。 感謝Johan與我們分享他的代碼。

希望這可以解決您的問題。 :)

+0

我們可以從XML加載動畫嗎? – Deepak 2012-04-30 12:49:42

+1

哦,我張貼在我自己的問題?我很傻。 :P – Deepak 2012-04-30 12:50:31

+0

我們可以在暫停使用後設置視圖位置嗎?我的意思是,假設我在之間使用了暫停方法,然後我想在暫停位置應用新動畫。可能嗎? – 2013-11-20 12:21:14

-1

你也可以這樣做:аможноещетак:

public class MyTranslateAnimation extends TranslateAnimation { 

    private long mTimePause, mTimeTotal; 
    private boolean mPause; 


    public MyTranslateAnimation(Context context, AttributeSet attrs) { 

     super(context, attrs); 

    } 

    @Override 
    public boolean getTransformation(long currentTime, Transformation outTransformation) { 
     updateTime(currentTime); 
     return super.getTransformation(mTimeTotal - mTimePause, outTransformation); 
    } 

    private void updateTime(long currentTime) { 
     long dt = currentTime - mTimeTotal; 
     mTimeTotal += dt; 
     if (mPause) { 
      mTimePause += dt; 
     } 
    } 

    public void pause() { 
     mPause = true; 
    } 

    public void resume() { 
     mPause = false; 
    } 

} 

從XML創建動畫,您可以創建自己的AnimationUtils子類,像這樣:длясозданияанимации изXMLможносделатьсвойAnimationUtils:

public class MyAnimationUtils { 

    public static Animation loadAnimation(Context context, int id) throws Resources.NotFoundException { 

     XmlResourceParser parser = null; 
     try { 
      parser = context.getResources().getAnimation(id); 
      return createAnimationFromXml(context, parser); 
     } catch (XmlPullParserException ex) { 
      Resources.NotFoundException rnf = new Resources.NotFoundException("Can't load animation resource ID #0x" + Integer.toHexString(id)); 
      rnf.initCause(ex); 
      throw rnf; 
     } catch (IOException ex) { 
      Resources.NotFoundException rnf = new Resources.NotFoundException("Can't load animation resource ID #0x" + Integer.toHexString(id)); 
      rnf.initCause(ex); 
      throw rnf; 
     } finally { 
      if (parser != null) parser.close(); 
     } 

    } 

    private static Animation createAnimationFromXml(Context c, XmlPullParser parser) throws XmlPullParserException, IOException { 

     return createAnimationFromXml(c, parser, null, Xml.asAttributeSet(parser)); 

    } 

    private static Animation createAnimationFromXml(Context c, XmlPullParser parser, AnimationSet parent, AttributeSet attrs) throws XmlPullParserException, IOException { 

     Animation anim = null; 

     // Make sure we are on a start tag. 
     int type; 
     int depth = parser.getDepth(); 

     while (((type=parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 
       && type != XmlPullParser.END_DOCUMENT) { 

      if (type != XmlPullParser.START_TAG) { 
       continue; 
      } 

      String name = parser.getName(); 

      if (name.equals("set")) { 
       anim = new AnimationSet(c, attrs); 
       createAnimationFromXml(c, parser, (AnimationSet)anim, attrs); 
      } else if (name.equals("alpha")) { 
       anim = new AlphaAnimation(c, attrs); 
      } else if (name.equals("scale")) { 
       anim = new ScaleAnimation(c, attrs); 
      } else if (name.equals("rotate")) { 
       anim = new RotateAnimation(c, attrs); 
      } else if (name.equals("translate")) { 
       //anim = new TranslateAnimation(c, attrs); 
       anim = new MyTranslateAnimation(c, attrs); // отредактировали только эту строчку, остальное взяли как было 
      } else { 
       throw new RuntimeException("Unknown animation name: " + parser.getName()); 
      } 

      if (parent != null) { 
       parent.addAnimation(anim); 
      } 
     } 

     return anim; 

    } 

} 

然後你建立這樣的動畫:и воттаксоздаеманимацию:

MyTranslateAnimation cloud1 = (MyTranslateAnimation) MyAnimationUtils.loadAnimation(this, R.anim.main_cloud1); 

希望這有助於。 Пользуйтесьназдоровье!