package com.bumptech.glide.load.resource.gif; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import com.bumptech.glide.gifdecoder.GifDecoder; public class GifDrawable extends Drawable implements Animatable, GifFrameManager.FrameCallback { private final Paint paint; private final GifFrameManager frameManager; private GifDecoder decoder; private boolean isRunning; private Bitmap currentFrame; private boolean isRecycled; public GifDrawable(GifDecoder decoder, GifFrameManager frameManager) { this.decoder = decoder; this.frameManager = frameManager; paint = new Paint(); } @Override public void start() { if (!isRunning) { isRunning = true; frameManager.getNextFrame(this); invalidateSelf(); } } @Override public boolean setVisible(boolean visible, boolean restart) { if (!visible) { stop(); } else { start(); } return super.setVisible(visible, restart); } @Override public int getIntrinsicWidth() { return decoder.getWidth(); } @Override public int getIntrinsicHeight() { return decoder.getHeight(); } @Override public void stop() { isRunning = false; } @Override public boolean isRunning() { return isRunning; } // For testing. void setIsRunning(boolean isRunning) { this.isRunning = isRunning; } @Override public void draw(Canvas canvas) { if (currentFrame != null) { canvas.drawBitmap(currentFrame, 0, 0, paint); } } @Override public void setAlpha(int i) { paint.setAlpha(i); } @Override public void setColorFilter(ColorFilter colorFilter) { paint.setColorFilter(colorFilter); } @Override public int getOpacity() { return decoder.isTransparent() ? PixelFormat.TRANSPARENT : PixelFormat.OPAQUE; } @Override public void onFrameRead(Bitmap frame) { if (!isRunning) { return; } if (frame != null) { currentFrame = frame; invalidateSelf(); } frameManager.getNextFrame(this); } public void recycle() { isRecycled = true; frameManager.clear(); } public boolean isRecycled() { return isRecycled; } }