Не могу остановить аниматор в андроиде после его запуска

Я пишу приложение, в котором у меня есть несколько представлений в RelativeLayout (в разных позициях, используйте поля), и я анимирую их с помощью нового API анимации в Honeycomb. Анимации повторяются, но им нужно подождать некоторое время между каждым повторением, поэтому я не могу использовать режим повтора.

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

Код:

if(!mMoving){
            mMoving = true;
            for(int i = 0; i < mImagesList.size(); i++){

                final LinearLayout f = mImagesList.get(i);
                if(mMoving){
                    ObjectAnimator anim = ObjectAnimator.ofFloat(f, "x", Math.round(mScreenWidth * 1.4));
                    mAnimators.add(anim);
                    anim.setDuration(mRandom.nextInt(10000) + 8000);
                    anim.setStartDelay((mRandom.nextInt(4000) + 3000) * (i / ITEMS_PER_SCREEN));
                    anim.addListener(new AnimatorListener() {


                        @Override
                        public void onAnimationEnd(Animator animation) {
                            if(mMoving){
                            mAnimators.remove(animation);

                                ImageView img = (ImageView)f.findViewById(R.id.stream_feed_item_pic);
                                int picWidth = img.getDrawable().getIntrinsicWidth();

                                Animator anim = ObjectAnimator.ofFloat(f, "x", -Math.round(picWidth * 1.4), Math.round(mScreenWidth * 1.2));

                                mAnimators.set(mAnimators.indexOf(animation), anim);

                                anim.setDuration(mRandom.nextInt(14000) + 8000);
                                anim.setStartDelay((mRandom.nextInt(6000) + 3000) * (mImagesList.size() / ITEMS_PER_SCREEN));
                                anim.addListener(this);
                                anim.start();
                            }
                        }
                    });
                    anim.start();
                }
            }
            mMoving = true;
            return true;
        }

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

Это моя (отчаянная) попытка остановить их:

if(mMoving){
                    mMoving = false;
                    for(Animator anim : mAnimators){
                        anim.setStartDelay(0);
                        anim.setDuration(0);
                        anim.start();
                        anim.cancel();
                        anim.removeAllListeners();
                        anim.setTarget(null);
                    }
                    mAnimators.clear();
                }

Вот как я перемещаю их в другой макет:

mContainer.removeAllViews();
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(picWidth, picHeight);
            params.leftMargin = 0;
            params.topMargin = 0;
            if(size == SMALL_SIZE){
                if(mSmallCounter < mSmallIdList.length){
                    RelativeLayout frame = (RelativeLayout)findViewById(mSmallIdList[mSmallCounter++]);
                    frame.addView(f, params);
                }
            }

Я очень отчаялся, я перепробовал около сотни способов!

ПРИМЕЧАНИЕ. ЭТО СОТОВЫЙ API. Я ИСПОЛЬЗУЮ АНИМАЦИЯ ДО 3.0.


person Elad92    schedule 08.03.2012    source источник
comment
Я столкнулся с той же проблемой. Вы когда-нибудь находили решение?   -  person Jens Zalzala    schedule 16.05.2012
comment
Нет, это одна из самых раздражающих вещей, в которые я когда-либо ввязывался. Пожалуйста, дайте мне знать, если вы найдете какой-либо ответ.   -  person Elad92    schedule 19.05.2012


Ответы (1)


И все же нет ответа? Может быть слишком поздно, но для читателей это решение:

anim.setRepeatCount(0);
person Khulja Sim Sim    schedule 11.10.2013
comment
у меня не работает; Я использую типы ObjectAnimator в AnimatorSet, и установка их RepeatCount и RepeatMode или одного или другого не останавливает их. - person wkhatch; 12.08.2014