diff --git a/library/src/androidTest/java/com/bumptech/glide/load/resource/gif/GifDrawableTest.java b/library/src/androidTest/java/com/bumptech/glide/load/resource/gif/GifDrawableTest.java index c737892748cd3d644206d3d1add4f874e3096d38..20b1998e6c371b494b3722c30f4924eaf9007be7 100644 --- a/library/src/androidTest/java/com/bumptech/glide/load/resource/gif/GifDrawableTest.java +++ b/library/src/androidTest/java/com/bumptech/glide/load/resource/gif/GifDrawableTest.java @@ -4,6 +4,7 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PixelFormat; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import com.bumptech.glide.gifdecoder.GifDecoder; import com.bumptech.glide.gifdecoder.GifHeader; @@ -23,7 +24,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.mock; @@ -60,7 +60,7 @@ public class GifDrawableTest { Canvas canvas = mock(Canvas.class); drawable.draw(canvas); - verify(canvas).drawBitmap(eq(firstFrame), anyInt(), anyInt(), any(Paint.class)); + verify(canvas).drawBitmap(eq(firstFrame), anyRect(), anyRect(), anyPaint()); } @Test @@ -71,8 +71,8 @@ public class GifDrawableTest { when(frameManager.getCurrentFrame()).thenReturn(null); drawable.draw(canvas); - verify(canvas).drawBitmap(eq(firstFrame), anyInt(), anyInt(), any(Paint.class)); - verify(canvas, never()).drawBitmap((Bitmap) isNull(), anyInt(), anyInt(), any(Paint.class)); + verify(canvas).drawBitmap(eq(firstFrame), anyRect(), anyRect(), anyPaint()); + verify(canvas, never()).drawBitmap((Bitmap) isNull(), anyRect(), anyRect(), anyPaint()); } @Test @@ -80,7 +80,7 @@ public class GifDrawableTest { drawable = new GifDrawable(gifDecoder, frameManager, null, bitmapPool); Canvas canvas = mock(Canvas.class); - verify(canvas, never()).drawBitmap(any(Bitmap.class), anyInt(), anyInt(), any(Paint.class)); + verify(canvas, never()).drawBitmap(any(Bitmap.class), anyRect(), anyRect(), anyPaint()); } @Test @@ -90,8 +90,8 @@ public class GifDrawableTest { when(frameManager.getCurrentFrame()).thenReturn(currentFrame); drawable.draw(canvas); - verify(canvas).drawBitmap(eq(currentFrame), anyInt(), anyInt(), any(Paint.class)); - verify(canvas, never()).drawBitmap(eq(firstFrame), anyInt(), anyInt(), any(Paint.class)); + verify(canvas).drawBitmap(eq(currentFrame), anyRect(), anyRect(), anyPaint()); + verify(canvas, never()).drawBitmap(eq(firstFrame), anyRect(), anyRect(), anyPaint()); } @Test @@ -459,7 +459,15 @@ public class GifDrawableTest { drawable.recycle(); Canvas canvas = mock(Canvas.class); drawable.draw(canvas); - verify(canvas, never()).drawBitmap(any(Bitmap.class), anyInt(), anyInt(), any(Paint.class)); + verify(canvas, never()).drawBitmap(any(Bitmap.class), anyRect(), anyRect(), anyPaint()); + } + + private static Paint anyPaint() { + return any(Paint.class); + } + + private static Rect anyRect() { + return any(Rect.class); } private void runLoops(int loopCount, int frameCount) { diff --git a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawable.java b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawable.java index 0f2e649e0928739186a2b1c4c6f1b4fd12849d41..1ed836c03b2c79f6f1f0b746aede21b403b6d6ed 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawable.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawable.java @@ -8,9 +8,11 @@ import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; +import android.view.Gravity; import com.bumptech.glide.gifdecoder.GifDecoder; import com.bumptech.glide.gifdecoder.GifHeader; import com.bumptech.glide.load.Transformation; @@ -22,6 +24,7 @@ import com.bumptech.glide.load.resource.drawable.GlideDrawable; */ public class GifDrawable extends GlideDrawable implements GifFrameManager.FrameCallback { private final Paint paint = new Paint(); + private final Rect destRect = new Rect(); private final GifFrameManager frameManager; private final GifState state; private final GifDecoder decoder; @@ -43,6 +46,8 @@ public class GifDrawable extends GlideDrawable implements GifFrameManager.FrameC /** The number of times to loop through the gif animation. */ private int maxLoopCount = LOOP_FOREVER; + private boolean applyGravity; + /** * Constructor for GifDrawable. * @@ -177,14 +182,26 @@ public class GifDrawable extends GlideDrawable implements GifFrameManager.FrameC this.isRunning = isRunning; } + @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + applyGravity = true; + } + @Override public void draw(Canvas canvas) { if (isRecycled) { return; } + + if (applyGravity) { + Gravity.apply(GifState.GRAVITY, getIntrinsicWidth(), getIntrinsicHeight(), getBounds(), destRect); + applyGravity = false; + } + Bitmap currentFrame = frameManager.getCurrentFrame(); Bitmap toDraw = currentFrame != null ? currentFrame : state.firstFrame; - canvas.drawBitmap(toDraw, 0, 0, paint); + canvas.drawBitmap(toDraw, null, destRect, paint); } @Override @@ -266,6 +283,7 @@ public class GifDrawable extends GlideDrawable implements GifFrameManager.FrameC } static class GifState extends ConstantState { + private static final int GRAVITY = Gravity.FILL; String id; GifHeader gifHeader; byte[] data;