Я использую 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 может быть отформатирован таким образом, чтобы он работал на некоторых устройствах, а не на других? Если да, есть ли у кого-нибудь какие-либо советы о том, какие инструменты использовать / как отформатировать их, чтобы они работали на максимально возможном количестве устройств?