Android GIF воспроизведение - PullRequest
0 голосов
/ 26 марта 2012

Я использую SampleView из действия BitmapDecode в демоверсиях API, чтобы показать анимированное изображение GIF.

    private static class SampleView extends View {


    private Movie mMovie;
    private long mMovieStart;

    private static byte[] streamToBytes(InputStream is) {
        ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
        byte[] buffer = new byte[1024];
        int len;
        try {
            while ((len = is.read(buffer)) >= 0) {
                os.write(buffer, 0, len);
            }
        } catch (java.io.IOException e) {
        }
        return os.toByteArray();
    }

    public SampleView(Context context) {
        super(context);
        setFocusable(true);

        this.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        java.io.InputStream is;

        is = context.getResources().openRawResource(R.drawable.angel);
        //Why was this put in an if statement if we default it to true?
        if (true) {
            mMovie = Movie.decodeStream(is);
        } else {
            byte[] array = streamToBytes(is);
            mMovie = Movie.decodeByteArray(array, 0, array.length);
        }
    }

    @Override protected void onDraw(Canvas canvas) {
        //canvas.drawColor(0xFFCCCCCC);            

        Paint p = new Paint();
        p.setAntiAlias(true);


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

До сих пор у меня была возможность протестировать на 3 устройствах: Sidekick 4g, Epic Touch 4g (Galaxy SII) и Nexus S.

GIF отображается правильно на кореш и галактики II. Но на Nexus S первый кадр отображается правильно, а затем на каждом втором кадре изображение заполняется статическими линиями, как телевизор с очень слабым сигналом.

Я также протестировал действие DecodeBitmap в демонстрационных версиях API на Nexus S, и анимированный GIF, который там включен, правильно отображается на этом устройстве.

Если я перетащу изображение «animated_gif.gif» из API Demos в мое приложение, оно будет отображаться правильно.

Я не очень знаком с форматом файла gif. Возможно ли, что мой gif может быть отформатирован таким образом, чтобы он работал на некоторых устройствах, а не на других? Если да, есть ли у кого-нибудь какие-либо советы о том, какие инструменты использовать / как отформатировать их, чтобы они работали на максимально возможном количестве устройств?

...