暂停和恢复翻译动画

我正在使用Translate Animation来移动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); 

一切都运行正常,但我无法暂停动画并按下按钮继续

我怎样才能做到这一点?

我尝试了一切,但没有成功。 知道怎么做吗?

请帮忙!

搜索了一段时间后,我发现这个链接并检查这是否适用于翻译动画,经过一些修改后,这也适用于你的动画。

见下面的修改代码:

 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与我们分享他的代码。

希望这能解决你的问题。 🙂

你也可以这样做: аможноещетак:

 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можносделатьсвойDynamicUtils:

 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); 

希望这可以帮助。 Пользуйтесьназдоровье!