Не удалось декодировать некоторые анимированные GIF-файлы с помощью Movie на Android 2.3.x или ниже - PullRequest
2 голосов
/ 11 ноября 2011

Я попытался использовать следующий фрагмент кода для декодирования анимированного GIF-файла с помощью класса Movie.

            URL url;
            InputStream is = null;
            BufferedInputStream bis = null;
                url = new URL("http://emos.plurk.com/aeddddbbf63e980128ab7b3c1fca2798_w48_h48.gif");
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

                is = httpURLConnection.getInputStream();
                bis = new BufferedInputStream(is);
                byte[] array = streamToBytes(bis);
                mGifMovie = Movie.decodeByteArray(array, 0, array.length);

и нарисуйте фильм в переопределенном методе onDraw в расширенном ImageView следующим образом:

if (mGifMovie != null) {
        long now = android.os.SystemClock.uptimeMillis();
        if (mMovieStart == 0) { // first time
            mMovieStart = now;
        }
        if (mGifMovie != null) {
            int dur = mGifMovie.duration();
            if (dur == 0) {
                dur = 1000;
            }
            int relTime = (int) ((now - mMovieStart) % dur);
            mGifMovie.setTime(relTime);
            mGifMovie.draw(canvas, 0, 0);
            invalidate();
        }
    }

Некоторые анимированные GIF-работы, но некоторые, как этот, нет. Оказалось, что некоторые кадры не удалось декодировать. Вот скриншот: http://i.imgur.com/HsxcP.png (исходное изображение: http://emos.plurk.com/aeddddbbf63e980128ab7b3c1fca2798_w48_h48.gif)

Я тестировал некоторые другие приложения на рынке. Они успешно декодируют анимированный GIF. Как мне сделать это правильно?

EDIT: Я хотел бы правильно декодировать анимированный Gif на своих устройствах 2.3.x, таких как эти приложения на рынке.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

На какой версии Android вы работаете? Поддержка анимированного GIF в классе Movie была довольно ограниченной до того, как этот коммит был объединен с кодом AOSP примерно в сентябре 2010 года, что, я полагаю, произошло после первого выпуска Gingerbread (уровень API 9).

Скорее всего, другие работающие приложения имеют собственный внутренний код декодирования GIF и не используют класс Movie.

ОБНОВЛЕНИЕ: я проверил код на эмуляторе для Android-10 (GB MR2) и Android-14 (ICS). На эмуляторе Android-10 изображение все еще неправильно декодируется, но на эмуляторе Android-14 работает нормально.

0 голосов
/ 21 ноября 2011

Я использовал собственный декодер gif для работы на устройствах под 3.0.Вот пример кода Java: http://www.java2s.com/Code/Java/2D-Graphics-GUI/DecodesaGIFfileintooneormoreframes.htm

...