Анимировать представление с помощью ArrayList

#java #android #arraylist #imageview #jquery-animate

#java #Android #список массивов #просмотр изображения #jquery-анимировать

Вопрос:

У меня есть ImageView, ArrayList и Кнопка. Мой ArrayList имеет несколько номеров. Например, 1,2,2,4,3. Когда я нажимаю на кнопку, я хочу анимировать ImageView с числами внутри ArrayList. В соответствии с образцом ArrayList. ArrayList[0]= 1 ImageView будет анимироваться вверх, ArrayList[1]= 2 ImageView будет анимироваться вниз. Анимация будет продолжаться со всем ArrayList внутри. Для этого я должен использовать «цикл for». Но анимация не продолжается, цикл анимации не работает. Работает только ArrayList[0], а затем останавливается.`Когда я нажимаю кнопку во второй раз, ArrayList[2] выполняет остановку. Я должен постоянно нажимать на кнопку, чтобы работать со всем ArrayList. Я хочу нажать на кнопку один раз, и я хочу обработать весь ArrayList.

 //imageViewPlay=button     hareketler=ArrayList    imageViewMario=ImageView
    imageViewPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            for (int i=0;i<hareketler.size();i  ){
                if (hareketler.get(0)==1){
                    imageViewMario.animate().y(imageViewMario.getY() -imageViewEngel.getHeight()-7).setDuration(2000).withEndAction(new Runnable() {
                        @Override
                        public void run() {
                            hareketler.remove(0);
                        }
                    });

                }
                if (hareketler.get(0)==2){
                    imageViewMario.animate().y(imageViewMario.getY()  imageViewEngel.getHeight() 7).setDuration(2000).withEndAction(new Runnable() {
                        @Override
                        public void run() {
                            hareketler.remove(0);
                        }
                    });
                }
                if (hareketler.get(0)==3){
                    imageViewMario.animate().x(imageViewMario.getX()  imageViewEngel.getHeight() 7).setDuration(2000).withEndAction(new Runnable() {
                        @Override
                        public void run() {
                            hareketler.remove(0);
                        }
                    });
                }
                if (hareketler.get(0)==4){
                   imageViewMario.animate().x(imageViewMario.getX() -imageViewEngel.getHeight()-7).setDuration(2000).withEndAction(new Runnable() {
                       @Override
                       public void run() {
                           hareketler.remove(0);
                       }
                   });
                }
            }

        }
    });
 

Ответ №1:

‘Работает только ArrayList[0], а затем останавливается’ Это потому, что вы жестко запрограммировали эту строку со значением 0 :

 if (hareketler.get(0)==...)
 

при этом всегда будет получен только первый элемент вашего массива.

Вы увеличиваете свой цикл for, но не позиции, которые вы получаете из массива.

 if (hareketler.get(i)==...)
 

это будет использовать значение i цикла for, чтобы также увеличить позицию вашего массива.

И тогда, конечно :

 hareketler.remove(i)
 

Ответ №2:

Это связано с тем, что withEndAction это не синхронный вызов и for не дождался завершения первой анимации. Что вам нужно, так это рекурсивная функция, которая будет вызвана снова в конце анимации. Вот так:

 private void playAnimation(){
    if (hareketler.get(0)==1){
        imageViewMario.animate().y(imageViewMario.getY() -imageViewEngel.getHeight()-7).setDuration(2000).withEndAction(runnable);
    }else if .... and so on
 

Также создайте runnable, который снова вызовет метод в конце анимации

 private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        hareketler.remove(0);
        playAnimation()
    }
};
 

И в вашем прослушивателе щелчков:

 imageViewPlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            playAnimation()
        }
    });
 

Надеюсь, это сработает.

Комментарии:

1. Ты лучший. Большое вам спасибо. Это работает

2. Спасибо, если это работает, тогда примите ответ