Fixed ThumbnailView sizing problems.

Glide will use the dimensions of the target ImageView as the dimensions
for the image it's loading. This caused problems in the case of
ThumbnailView, as we were constantly changing the ImageView dimensions,
meaning Glide may not have the most recent values (it may be called in
between measure calls, for instance).

To solve this, we now will always override the default image dimensions
when we load an image. If no dimensions are present, we will default to
the layout_width and layout_height of the ThumbnailView.

Fixes #7810
This commit is contained in:
Greyson Parrelli 2018-05-22 16:59:42 -04:00
parent 07e8ae716c
commit a792a6e6ae

View File

@ -10,6 +10,7 @@ import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
@ -225,10 +226,6 @@ public class ThumbnailView extends FrameLayout {
boolean showControls, boolean isPreview, int naturalWidth, boolean showControls, boolean isPreview, int naturalWidth,
int naturalHeight) int naturalHeight)
{ {
dimens[WIDTH] = naturalWidth;
dimens[HEIGHT] = naturalHeight;
invalidate();
if (showControls) { if (showControls) {
getTransferControls().setSlide(slide); getTransferControls().setSlide(slide);
getTransferControls().setDownloadClickListener(new DownloadClickDispatcher()); getTransferControls().setDownloadClickListener(new DownloadClickDispatcher());
@ -263,6 +260,10 @@ public class ThumbnailView extends FrameLayout {
this.slide = slide; this.slide = slide;
dimens[WIDTH] = naturalWidth;
dimens[HEIGHT] = naturalHeight;
invalidate();
if (slide.getThumbnailUri() != null) buildThumbnailGlideRequest(glideRequests, slide).into(image); if (slide.getThumbnailUri() != null) buildThumbnailGlideRequest(glideRequests, slide).into(image);
else if (slide.hasPlaceholder()) buildPlaceholderGlideRequest(glideRequests, slide).into(image); else if (slide.hasPlaceholder()) buildPlaceholderGlideRequest(glideRequests, slide).into(image);
else glideRequests.clear(image); else glideRequests.clear(image);
@ -316,14 +317,31 @@ public class ThumbnailView extends FrameLayout {
.diskCacheStrategy(DiskCacheStrategy.NONE), new FitCenter()); .diskCacheStrategy(DiskCacheStrategy.NONE), new FitCenter());
} }
private GlideRequest applySizing(@NonNull GlideRequest request, @NonNull BitmapTransformation unavailableDimensSizing) { private GlideRequest applySizing(@NonNull GlideRequest request, @NonNull BitmapTransformation fitting) {
int[] size = new int[2]; int[] size = new int[2];
fillTargetDimensions(size, dimens, bounds); fillTargetDimensions(size, dimens, bounds);
if (size[WIDTH] == 0 && size[HEIGHT] == 0) { if (size[WIDTH] == 0 && size[HEIGHT] == 0) {
return request.transforms(unavailableDimensSizing, new RoundedCorners(radius)); size[WIDTH] = getDefaultWidth();
size[HEIGHT] = getDefaultHeight();
} }
return request.override(size[WIDTH], size[HEIGHT]) return request.override(size[WIDTH], size[HEIGHT])
.transforms(new CenterCrop(), new RoundedCorners(radius)); .transforms(fitting, new RoundedCorners(radius));
}
private int getDefaultWidth() {
ViewGroup.LayoutParams params = getLayoutParams();
if (params != null) {
return Math.max(params.width, 0);
}
return 0;
}
private int getDefaultHeight() {
ViewGroup.LayoutParams params = getLayoutParams();
if (params != null) {
return Math.max(params.height, 0);
}
return 0;
} }
private class ThumbnailClickDispatcher implements View.OnClickListener { private class ThumbnailClickDispatcher implements View.OnClickListener {