Я создал приложение, которое отображает около 250 изображений в ImageView. Изображения загружаются один за другим, 15-30 изображений в секунду. В принципе, все это создает иллюзию вращающегося 3D-объекта, по крайней мере, он должен. Проблема следующая: приложение зависает при загрузке определенных изображений (т. Е. Я вижу несколько секунд анимации жидкости, а затем зависает анимация, прыгаю 10-15 кадров (изображений) вперед и продолжается. Это всегда происходит в тех же местах цикла анимации. Я, хотя у этого Android, возможно, не хватает ресурсов для обработки чего-то подобного, поэтому я изменил размер изображений до половины их размера, но он не помог. Я пробовал буферизацию изображений, но это не помогло (на самом деле, возможно, немного, я думаю, что анимация выглядит немного более гладкой). И теперь самое странное. Я использую сенсорный экран, чтобы пользователи могли «вращать» 3D-объект на этих изображениях, а при повороте я снова испытываю эти зависания точно так же, как и с анимацией.Загрузка Android и отображение большого количества изображений в ImageView (покадровая анимация) зависает в определенные моменты
Все изображения в формате .png и их размер варьируется от 15kB до 40 КБ.
Я использую следующий код для анимации:
new Thread(new Runnable() {
@Override
public void run() {
while (!stopStartupAnimation && li < images_360.length) {
final int fli = li;
handler.post(new Runnable() {
@Override
public void run() {
//Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
//imageCanvas.setImageResource(images_360[fli]);
imageCanvas.setImageBitmap(imageStackNext.pop());
System.out.println("rawX = " + fli);
}
});
int ti = fli +25;
if(ti > images_360.length-1){
ti = ti - images_360.length;
}
imageStackNext.push(BitmapFactory.decodeResource(getResources(), images_360[ti]));
synchronized (this) {
try {
wait(1000/25);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
li++;
li++;
if (li >= images_360.length) {
li = 0;
}
}
}
}).start();
Изображения не загружаются сразу, но один за другим. Вы правы в OpenGL, но использование этого для этого приложения было бы излишним, поскольку объект, который я анимирую, не является кубом или чем-то простым, плюс есть нечто большее, чем просто этот объект. Я знаю, что postRunnable() не вступает в силу немедленно, и я попытался использовать postDelayed(), но он производит тот же эффект. – Milan
Кроме того, я уже писал, что я попытался изменить размер изображений на половину их размера и что он не помог. То, что я не смог сказать, заключается в том, что, когда я использую сенсорный экран для поворота 3D-объекта (путем прокрутки сенсорного экрана), не имеет значения, поверну его на 360 ° или на 10 ', зависания все еще присутствуют точно в том же месте, где они произошли в анимации. – Milan
«Вы правы в OpenGL, но использовать его для этого приложения было бы излишним, поскольку объект, который я анимация, не является кубом или чем-то простым». Итак, вы думаете, что способ эффективного внедрения не простой 3D-анимации - это избежать технологии аппаратного ускорения 3D и использовать более эффективную альтернативу? «Я знаю, что postRunnable() не вступает в силу немедленно, и я попытался использовать postDelayed(), но он дает тот же эффект». Конечно, это будет - оба они помещают события в очередь основного потока. Это неизбежно при использовании виджетов, поэтому 3D-анимация не должна использовать виджеты. – CommonsWare