現在、ムービーを使用してカスタム ビューで gif 画像を表示しようとしています。私は文字通りこれを行う最も一般的な方法を使用しました:
public class GifView extends View {
private Movie movie;
private long timeElapsed;
public GifView(Context context) {
super(context);
init();
}
public GifView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public GifView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
timeElapsed = 0;
setImage(getResources().openRawResource(R.drawable.sample));
}
public void setImage(byte[] bytes) {
movie = Movie.decodeByteArray(bytes, 0, bytes.length);
invalidate();
}
public void setImage(InputStream is) {
movie = Movie.decodeStream(is);
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT);
super.onDraw(canvas);
long now = android.os.SystemClock.uptimeMillis();
if (timeElapsed == 0) { // first time
timeElapsed = now;
}
if (movie != null) {
int dur = movie.duration();
if (dur == 0) {
dur = 1000;
}
int relTime = (int)((now - timeElapsed) % dur);
movie.setTime(relTime);
movie.draw(canvas, getWidth() - movie.width(), getHeight() - movie.height());
invalidate();
}
}
}
これにより、携帯電話 (API 18 を実行する Nexus 4) に GIF の最初のフレームのみが表示されます。このビューを表示するには、このビューのハードウェア アクセラレーションを無効にする必要があることを読みました (関連する行を削除しても何も表示されません)。他の gif 画像で試してみましたが、同じ結果が得られました。私が気づいたことの 1 つは、movie.getDuration()
常に 0 を返すことです。これは奇妙ですよね? 何か案が?