Как остановить анимацию в Android - PullRequest
6 голосов
/ 31 марта 2012

Требования:

Мне нужно запустить несколько анимаций одну за другой. Я использую onAnimationEnd () для этого.

Во время анимации в случае сенсорного события мне нужно остановить анимацию и отобразить новое изображение в этом месте.

Проблемы:

  1. Я использую clearAnimation () в случае onTouch. Из-за этого вся анимация была удалена. Мое намерение - остановить анимацию и отобразить новое изображение в затронутой части. Как мне этого добиться?

  2. Из-за clearAnimation () onAnimationEnd () вызывается несколько раз, и я сталкиваюсь с проблемами при запуске анимации одна за другой.

  3. Есть ли какая-либо функция, чтобы просто остановить анимацию вместо полной ее очистки? Я использую Android 2.1.

@Override
public boolean onTouch(View v, MotionEvent event) {      
    switch(event.getAction()) {
        case MotionEvent.ACTION_UP:
            imageArray[g_animCount - 1].clearAnimation();          
            break;

        default:
            break;
    }

    return true; // indicate event was handled
}

@Override
public void onAnimationEnd(Animation animation) {
    layout.removeView(imageArray[g_animCount - 1]);
    if ( (g_animCount < count))
    {               
        startNextAnimation();
    }
    else
    {
        g_animCount = 0;
        isBegin = false;
    }
}

public void startNextAnimation()
{
     int j = random.nextInt(200);
     layoutParams.setMargins(j, -20, 30, 0);
     layout.addView(imageArray[g_animCount], layoutParams); 
     imageArray[g_animCount].startAnimation(movArray[g_animCount]);
     g_animCount++;
}

1 Ответ

9 голосов
/ 31 марта 2012

Анимация перемещает только пиксели на экране, а не положение объекта. Чтобы установить, чтобы он оставался на месте, установите

animation.setFillAfter(true);

Чтобы на самом деле переместить положение объекта, изучите использование модифицированной версии приведенного ниже фрагмента кода.

MarginLayoutParams marginParams = new MarginLayoutParams(object.getLayoutParams());
marginParams.setMargins(left, (top+hol2), left, 0);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
object.setLayoutParams(layoutParams);

Относительно onAnimationEnd, вызываемого несколько раз, мне нужно будет увидеть код.

Я знаю только два способа вручную остановить анимацию:

animation.cancel(); (may not work for 2.1, can't remember)

или

object.clearAnimation();

Пример кода ниже:

    upmotionleft = new TranslateAnimation(0, 0, 0, 600);
    upmotionleft.setDuration(2000);
    upmotionleft.setFillEnabled(true);
    upmotionleft.setAnimationListener(new Animation.AnimationListener() 
    {
        @Override
        public void onAnimationStart(Animation animation) 
        {}
        @Override
        public void onAnimationEnd(Animation animation) 
        {
            //sets to wherever I want the final object to be
            MarginLayoutParams marginParams = new MarginLayoutParams(object.getLayoutParams());
            marginParams.setMargins(left, top-hol2, left, 0);
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
            object.setLayoutParams(layoutParams);

            //starts next animation
            object.startAnimation(nextAnimation);
        }

        @Override
        public void onAnimationRepeat(Animation animation) 
        {}
    });

object.startAnimation(upmotionleft);

Этот код скопирован и вставлен из моего проекта, но он несколько изменился, все равно должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...