Как часто и плавно менять большое количество изображений в одном и том же ImageView? - PullRequest
0 голосов
/ 31 января 2012

Я работаю над вращателем изображения на 360 градусов в Android, как показано на этой ссылке: http://developer.apple.com/safaridemos/showcase/threesixty/

Для этого случая использования я просто использую более 40 изображений, которые будут отображаться под разными углами, когда пользовательпрокручивает по горизонтали.используя этот код:

public boolean onScroll
      (MotionEvent e1, MotionEvent e2, float distanceX, float  distanceY) 
 {      
    Log.i(TAG, "distanceX = "+distanceX);
    if(distanceX > 3){
        if(imageCounter < imgArr.length - 1){
            imageCounter++;             
        }else{
            imageCounter = 0;               
        }
        imageSwitcher.setImageResource(imgArr[imageCounter]);

    }else if(distanceX < -3){
        if(imageCounter > 0){
            imageCounter--;
        }else{
            imageCounter = imgArr.length - 1; 
        }
        imageSwitcher.setImageResource(imgArr[imageCounter]);
    }
    return true;
 }

Моя проблема в том, что переключение изображений происходит недостаточно плавно.Взгляд на Logcat говорит о том, что с каждыми 2-3 переключателями в изображениях сборщик мусора выполняет свою работу и каждый раз занимает около 20 миллисекунд.Эти несколько миллисекунд вызывают проблемы при плавном вращении на 360 градусов.

Ответы [ 2 ]

0 голосов
/ 31 января 2012

setImageResource () не быстрый метод. В зависимости от размера ваших изображений, это, вероятно, основной источник вашей задержки. При каждом вызове Android необходимо распаковывать файлы изображений PNG, и это может занять «много времени». Подумайте о предварительной загрузке ваших ресурсов в растровые изображения, если они не занимают слишком много памяти. Если установка изображения в ваш ImageView также является источником задержки, рассмотрите возможность рисования прямо на холсте. Я проверял это, и даже на медленных устройствах полноэкранное рисование растрового изображения может происходить как минимум 30 раз в секунду.

0 голосов
/ 31 января 2012

Вы можете попробовать изменить imgArr на массив растровых изображений, а затем использовать setImageBitmap вместо setImageResource.Если вы используете только 40 изображений, вы должны уместить все те, которые находятся в памяти.При загрузке всех битмапов при запуске будет небольшая задержка (должно быть <1 секунда) для загрузки всех битмапов, но это должно сделать его гладким, ГХ не будет собирать битмапы, если на них все еще есть ссылки.</p>

Это может быть даже не GC, если честно.Использование setImageResource заставляет битовые карты считываться и декодироваться в потоке пользовательского интерфейса, что может вызывать проблемы с задержкой.Это отмечено в документах здесь .

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