1db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddpackage com.bumptech.glide.request.target; 2db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd 3db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddimport android.widget.ImageView; 4db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd 5db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddimport com.bumptech.glide.load.resource.drawable.GlideDrawable; 6db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddimport com.bumptech.glide.request.animation.GlideAnimation; 7db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd 8db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd/** 9db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * A {@link com.bumptech.glide.request.target.Target} that can display an {@link android.graphics.drawable.Drawable} in 10db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * an {@link android.widget.ImageView}. 11db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd */ 12db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Juddpublic class GlideDrawableImageViewTarget extends ImageViewTarget<GlideDrawable> { 13db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd private static final float SQUARE_RATIO_MARGIN = 0.05f; 14db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd private int maxLoopCount; 15db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd private GlideDrawable resource; 16db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd 17db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd /** 18db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * Constructor for an {@link com.bumptech.glide.request.target.Target} that can display an 19db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * {@link com.bumptech.glide.load.resource.drawable.GlideDrawable} in an {@link android.widget.ImageView}. 20db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * 21db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * @param view The view to display the drawable in. 22db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd */ 23db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd public GlideDrawableImageViewTarget(ImageView view) { 24db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd this(view, GlideDrawable.LOOP_FOREVER); 25db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 26db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd 27db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd /** 28db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * Constructor for an {@link com.bumptech.glide.request.target.Target} that can display an 29db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * {@link com.bumptech.glide.load.resource.drawable.GlideDrawable} in an {@link android.widget.ImageView}. 30db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * 31db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * @param view The view to display the drawable in. 32db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * @param maxLoopCount A value to pass to to {@link com.bumptech.glide.load.resource.drawable.GlideDrawable}s 33db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * indicating how many times they should repeat their animation (if they have one). See 34db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * {@link com.bumptech.glide.load.resource.drawable.GlideDrawable#setLoopCount(int)}. 35db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd */ 36db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd public GlideDrawableImageViewTarget(ImageView view, int maxLoopCount) { 37db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd super(view); 38db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd this.maxLoopCount = maxLoopCount; 39db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 40db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd 41db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd /** 42db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * {@inheritDoc} 43db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * If no {@link com.bumptech.glide.request.animation.GlideAnimation} is given or if the animation does not set the 44db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * {@link android.graphics.drawable.Drawable} on the view, the drawable is set using 45db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * {@link android.widget.ImageView#setImageDrawable(android.graphics.drawable.Drawable)}. 46db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * 47db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * @param resource {@inheritDoc} 48db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * @param animation {@inheritDoc} 49db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd */ 50db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd @Override 51db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) { 52db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd if (!resource.isAnimated()) { 53db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd //TODO: Try to generalize this to other sizes/shapes. 54db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd // This is a dirty hack that tries to make loading square thumbnails and then square full images less costly 55db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd // by forcing both the smaller thumb and the larger version to have exactly the same intrinsic dimensions. 56db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd // If a drawable is replaced in an ImageView by another drawable with different intrinsic dimensions, 57db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd // the ImageView requests a layout. Scrolling rapidly while replacing thumbs with larger images triggers 58db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd // lots of these calls and causes significant amounts of jank. 59db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd float viewRatio = view.getWidth() / (float) view.getHeight(); 60db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd float drawableRatio = resource.getIntrinsicWidth() / (float) resource.getIntrinsicHeight(); 61db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd if (Math.abs(viewRatio - 1f) <= SQUARE_RATIO_MARGIN 62db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd && Math.abs(drawableRatio - 1f) <= SQUARE_RATIO_MARGIN) { 63db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd resource = new SquaringDrawable(resource, view.getWidth()); 64db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 65db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 66db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd super.onResourceReady(resource, animation); 67db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd this.resource = resource; 68db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd resource.setLoopCount(maxLoopCount); 69db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd resource.start(); 70db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 71db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd 72db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd /** 73db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * Sets the drawable on the view using 74db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * {@link android.widget.ImageView#setImageDrawable(android.graphics.drawable.Drawable)}. 75db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * 76db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd * @param resource The {@link android.graphics.drawable.Drawable} to display in the view. 77db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd */ 78db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd @Override 79db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd protected void setResource(GlideDrawable resource) { 80db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd view.setImageDrawable(resource); 81db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 82db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd 83db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd @Override 84db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd public void onStart() { 85db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd if (resource != null) { 86db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd resource.start(); 87db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 88db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 89db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd 90db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd @Override 91db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd public void onStop() { 92db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd if (resource != null) { 93db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd resource.stop(); 94db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 95db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd } 96db85af9fc44f98de5cfc2eb0c8b49ab44242d235Sam Judd} 97