Пауза и возобновление перевода анимации

Я использую 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);

Все работает нормально, но я не могу приостановить анимацию и возобновить ее нажатием кнопки.

Как я могу это сделать?

Я пробовал все, но не удалось. есть идеи как это сделать?

Пожалуйста помоги!


person Pari    schedule 04.04.2012    source источник


Ответы (2)


После поиска я нашел эту ссылку и проверил, работает ли она для Translate Animation или нет, и после некоторой модификации это работает для вашей анимации тоже.!

См. измененный код ниже:

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

и после запуска анимации у вас есть только методы паузы и возобновления вызова. Спасибо Йохану за то, что он поделился с нами своим кодом.

Надеюсь, это решит вашу проблему. :)

person Deepak    schedule 05.04.2012
comment
Можем ли мы загрузить анимацию из XML? - person Deepak; 30.04.2012
comment
Можем ли мы установить положение просмотра после использования на паузе. Я имею в виду, предположим, что я использую метод паузы между ними, а затем я хочу применить новую анимацию в месте паузы. Является ли это возможным? - person Mohit Verma; 20.11.2013
comment
Работал на меня! Спасибо, - person Peter Arandorenko; 20.01.2014

Вы также можете сделать так: а можно еще так:

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

Надеюсь это поможет. Пользуйтесь на здоровье!

person Roman    schedule 15.06.2015