valueanimator.start перезапускает анимацию после valueanimator.cancel в API ‹ 19

я знаю, что это задано до того, как я попробовал все решения, но я не могу исправить это, у меня есть объекты, которые падают с верхней части экрана на нижнюю часть экрана с помощью перевода в библиотеке Android.

я хочу приостановить анимацию и возобновить ее:

КОД ПАУЗЫ исправлен из предложения в одном из сообщений о переполнении стека:

private void pauseAnimation() {
        p = true;
        Pausearray = new MyClass[mAllImageViews.size()];
        int count = 0;
        for (ArrowView v : mAllImageViews) {
            ValueAnimator va = (ValueAnimator) v.getTag();
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                va.pause();
            } else {
                if (va != null) {
                    MyClass temp = new MyClass();
                    temp.tag = v.getTag().toString();
                    temp.playtime = va.getCurrentPlayTime();
                    Pausearray[count] = temp;
                    va.cancel();
                }
            }
            count ++;
        }
    }

пауза работает анимация перестает двигаться и остается на месте.

КОД ВОЗОБНОВЛЕНИЯ, предложенный одним из сообщений о переполнении стека:

   private void resumeAnimation() {
        p = false;
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            for (ArrowView v : mAllImageViews) {
                try {
                    ValueAnimator va = (ValueAnimator) v.getTag();
                    va.resume();
                } catch (Exception ex) {

                }
            }
        } else {
            if(Pausearray!=null) {
                for (ArrowView v : mAllImageViews) {
                    ValueAnimator va = (ValueAnimator) v.getTag();
                    for (int i = 0; i < Pausearray.length; i++) {
                        if(v.getTag().toString().equalsIgnoreCase(Pausearray[i].tag)){
                            va.start();
                            va.setCurrentPlayTime(Pausearray[i].playtime);
                        }
                    }
                }
            }
        }
    }

проблема с резюме в том, что оно снова начинается сверху, я хочу, чтобы оно продолжалось там, где оно было на экране. Благодарю вас!

Обновлять:

я попытался получить позицию просмотра стрелки с экрана и установить ее при возобновлении, я все еще получаю ту же проблему, представления перезапускаются, поэтому отредактированный код:

  private void resumeAnimation() {
        p = false;
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            for (ArrowView v : mAllImageViews) {
                try {
                    ValueAnimator va = (ValueAnimator) v.getTag();
                    va.resume();
                } catch (Exception ex) {

                }
            }
        } else {
            if(Pausearray!=null) {
                for (ArrowView v : mAllImageViews) {
                    ValueAnimator va = (ValueAnimator) v.getTag();
                    for (int i = 0; i < Pausearray.length; i++) {
                        if(v.getTag().toString().equalsIgnoreCase(Pausearray[i].tag)){
                            Log.w("PAUSETEST","Setting Parameters "+Pausearray[i].playtime);
                            va.start();
                            va.setCurrentPlayTime(Pausearray[i].playtime);
                            v.setY(Pausearray[i].translationy); // i took the location via v.gettranslationY on pause
                        }
                    }
                }
            }
        }
    }

ОБНОВЛЕНИЕ: во время поиска я слышал, что valueanimator не перезапускается, поэтому я переключил valueanimator на код аниматора объектного аниматора:

 public void startAnimation(final ArrowView aniView) {
    aniView.setPivotX(aniView.getWidth());
    aniView.setPivotY(aniView.getHeight());

    long delay = new Random().nextInt(Constants.MAX_DELAY);// generate a random delay time before the animation starts to go down

    ObjectAnimator animator = ObjectAnimator.ofFloat(aniView,"translationY", mDisplaySize.bottom - (buttonsize) - (90 * mScale));
    if (aniView.getColor() == 0 && aniView.draw == false) {
        Constants.ANIM_DURATION = Constants.ANIM_DURATION_NORMAL;
    } else if (aniView.getColor() != 0 && aniView.draw == false) {
        Constants.ANIM_DURATION = Constants.ANIM_DURATION_COLOR;
    } else if (aniView.getColor() == 0 && aniView.draw == true) {
        Constants.ANIM_DURATION = Constants.ANIM_DURATION_COLOR;
    } else if (aniView.getColor() != 0 && aniView.draw == true) {
        Constants.ANIM_DURATION = Constants.ANIM_DURATION_COLORANDCALC;
    }
    animator.setDuration(Constants.ANIM_DURATION);// speed of the falldown
    animator.setInterpolator(new AccelerateInterpolator());
    animator.setStartDelay(delay);// start the animation after the delay.
//        animator.addUpdateListener(new AnimatorUpdateListener() {
//
//            //int angle = 50 + (int) (Math.random() * 101);
//            //int movex = new Random().nextInt(mDisplaySize.right);
//
//            @Override
//            public void onAnimationUpdate(ValueAnimator animation) {
//                float value = ((Float) (animation.getAnimatedValue())).floatValue();
//                //aniView.setRotation(angle*value);
//                //aniView.setTranslationX((movex-40)*value);
//                aniView.setTranslationY((mDisplaySize.bottom - (buttonsize)) * value - (90 * mScale));// set the translation to fall down and stop on the top of buttons
//            }
//        });
    aniView.setTag(animator);
    animator.start();
}

и я изменил код паузы/возобновления, чтобы передать его в объектный аниматор, и я все еще сталкиваюсь с той же проблемой... при запуске перезапускается анимация! пожалуйста, помогите! Спасибо!


person ziad kiwan    schedule 18.06.2017    source источник


Ответы (1)


Поиграв с классом valueanimator, я придумал трюк, чтобы остановить анимацию и возобновить ее не подлинным способом, но он решает проблему, я расширил класс аниматора значений и заменил обычный аниматор в моем основном классе классом myvalueanimator. и здесь игра в классе аниматора значений:

import android.animation.ValueAnimator;
import android.util.Log;

import java.util.Timer;

/**
 * Created by win7 on 6/21/2017.
 */

public class MyValueAnimator extends ValueAnimator {
    private float animatedValue = 0;
    private long currenttime;
    private long totaltime;
    private boolean onetime = true;
    private volatile boolean mPaused = false;
    private Timer t;

public void pause() {
    animatedValue = (float) getAnimatedValue();
    mPaused = true;
}

//    @Override
//    public void setValues(PropertyValuesHolder... values) {
//        if (mPaused)
//            return;
//        super.setValues(values);
@Override
public Object getAnimatedValue() {
    if (mPaused) {
        if(onetime){
            currenttime = getCurrentPlayTime();
         //   totaltime = getStartDelay()+ (getDuration() * (getRepeatCount() + 1));
            totaltime = getDuration();
            setDuration(Long.parseLong("9999999999999999"));
            Log.w("PauseDur",Long.parseLong("9999999999999999")+"");
            onetime =false;
        }
        return animatedValue;
    }
    return super.getAnimatedValue();
}

public void resume() {
    mPaused = false;
    onetime=true;
    setCurrentPlayTime(currenttime);
    setDuration(totaltime);
}

public MyValueAnimator(float from, float to) {
    setFloatValues(from, to);
}

}
person ziad kiwan    schedule 23.06.2017