#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. Спасибо, если это работает, тогда примите ответ