package org.xutils.image; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.view.ViewGroup; import android.view.animation.Animation; import android.widget.ImageView; import org.xutils.common.util.DensityUtil; import org.xutils.common.util.LogUtil; import org.xutils.http.RequestParams; import java.lang.reflect.Field; /** * Created by wyouflf on 15/8/21. * 图片加载参数 */ public class ImageOptions { public final static ImageOptions DEFAULT = new ImageOptions(); // region ###################### decode options (equals & hashcode prop) ################ private int maxWidth = 0; private int maxHeight = 0; private int width = 0; // 小于0时不采样压缩. 等于0时自动识别ImageView的宽高和maxWidth. private int height = 0; // 小于0时不采样压缩. 等于0时自动识别ImageView的宽高和maxHeight. private boolean crop = false; // crop to (width, height) private int radius = 0; private boolean square = false; private boolean circular = false; private boolean autoRotate = false; private boolean compress = true; private Bitmap.Config config = Bitmap.Config.RGB_565; // gif option private boolean ignoreGif = true; // end region ########################################## decode options ################# // region ############# display options private int loadingDrawableId = 0; private int failureDrawableId = 0; private Drawable loadingDrawable = null; private Drawable failureDrawable = null; private boolean forceLoadingDrawable = true; private ImageView.ScaleType placeholderScaleType = ImageView.ScaleType.CENTER_INSIDE; private ImageView.ScaleType imageScaleType = ImageView.ScaleType.CENTER_CROP; private boolean fadeIn = false; private Animation animation = null; // end region ############ display options // extends private boolean useMemCache = true; private ParamsBuilder paramsBuilder; protected ImageOptions() { } /*package*/ final void optimizeMaxSize(ImageView view) { if (width > 0 && height > 0) { maxWidth = width; maxHeight = height; return; } int screenWidth = DensityUtil.getScreenWidth(); int screenHeight = DensityUtil.getScreenHeight(); if (width < 0) { maxWidth = screenWidth * 3 / 2; //Integer.MAX_VALUE; compress = false; } if (height < 0) { maxHeight = screenHeight * 3 / 2; //Integer.MAX_VALUE; compress = false; } if (view == null && maxWidth <= 0 && maxHeight <= 0) { maxWidth = screenWidth; maxHeight = screenHeight; } else { int tempWidth = maxWidth; int tempHeight = maxHeight; if (view != null) { final ViewGroup.LayoutParams params = view.getLayoutParams(); if (params != null) { if (tempWidth <= 0) { if (params.width > 0) { tempWidth = params.width; if (this.width <= 0) { this.width = tempWidth; } } else if (params.width != ViewGroup.LayoutParams.WRAP_CONTENT) { tempWidth = view.getWidth(); } } if (tempHeight <= 0) { if (params.height > 0) { tempHeight = params.height; if (this.height <= 0) { this.height = tempHeight; } } else if (params.height != ViewGroup.LayoutParams.WRAP_CONTENT) { tempHeight = view.getHeight(); } } } if (tempWidth <= 0) tempWidth = getImageViewFieldValue(view, "mMaxWidth"); if (tempHeight <= 0) tempHeight = getImageViewFieldValue(view, "mMaxHeight"); } if (tempWidth <= 0) tempWidth = screenWidth; if (tempHeight <= 0) tempHeight = screenHeight; maxWidth = tempWidth; maxHeight = tempHeight; } } public int getMaxWidth() { return maxWidth; } public int getMaxHeight() { return maxHeight; } public int getWidth() { return width; } public int getHeight() { return height; } public boolean isCrop() { return crop; } public int getRadius() { return radius; } public boolean isSquare() { return square; } public boolean isCircular() { return circular; } public boolean isIgnoreGif() { return ignoreGif; } public boolean isAutoRotate() { return autoRotate; } public boolean isCompress() { return compress; } public Bitmap.Config getConfig() { return config; } public Drawable getLoadingDrawable(ImageView view) { if (loadingDrawable == null && loadingDrawableId > 0 && view != null) { try { loadingDrawable = view.getResources().getDrawable(loadingDrawableId); } catch (Throwable ex) { LogUtil.e(ex.getMessage(), ex); } } return loadingDrawable; } public Drawable getFailureDrawable(ImageView view) { if (failureDrawable == null && failureDrawableId > 0 && view != null) { try { failureDrawable = view.getResources().getDrawable(failureDrawableId); } catch (Throwable ex) { LogUtil.e(ex.getMessage(), ex); } } return failureDrawable; } public boolean isFadeIn() { return fadeIn; } public Animation getAnimation() { return animation; } public ImageView.ScaleType getPlaceholderScaleType() { return placeholderScaleType; } public ImageView.ScaleType getImageScaleType() { return imageScaleType; } public boolean isForceLoadingDrawable() { return forceLoadingDrawable; } public boolean isUseMemCache() { return useMemCache; } public ParamsBuilder getParamsBuilder() { return paramsBuilder; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ImageOptions options = (ImageOptions) o; if (maxWidth != options.maxWidth) return false; if (maxHeight != options.maxHeight) return false; if (width != options.width) return false; if (height != options.height) return false; if (crop != options.crop) return false; if (radius != options.radius) return false; if (square != options.square) return false; if (circular != options.circular) return false; if (autoRotate != options.autoRotate) return false; if (compress != options.compress) return false; return config == options.config; } @Override public int hashCode() { int result = maxWidth; result = 31 * result + maxHeight; result = 31 * result + width; result = 31 * result + height; result = 31 * result + (crop ? 1 : 0); result = 31 * result + radius; result = 31 * result + (square ? 1 : 0); result = 31 * result + (circular ? 1 : 0); result = 31 * result + (autoRotate ? 1 : 0); result = 31 * result + (compress ? 1 : 0); result = 31 * result + (config != null ? config.hashCode() : 0); return result; } @Override public String toString() { StringBuilder sb = new StringBuilder("_"); sb.append(maxWidth).append("_"); sb.append(maxHeight).append("_"); sb.append(width).append("_"); sb.append(height).append("_"); sb.append(radius).append("_"); sb.append(config).append("_"); sb.append(crop ? 1 : 0).append(square ? 1 : 0).append(circular ? 1 : 0); sb.append(autoRotate ? 1 : 0).append(compress ? 1 : 0); return sb.toString(); } private static int getImageViewFieldValue(ImageView view, String fieldName) { int value = 0; try { Field field = ImageView.class.getDeclaredField(fieldName); field.setAccessible(true); int fieldValue = (Integer) field.get(view); if (fieldValue > 0 && fieldValue < Integer.MAX_VALUE) { value = fieldValue; } } catch (Throwable ignored) { } return value; } public interface ParamsBuilder { RequestParams buildParams(RequestParams params, ImageOptions options); } public static class Builder { protected ImageOptions options; public Builder() { newImageOptions(); } protected void newImageOptions() { options = new ImageOptions(); } public ImageOptions build() { return options; } /** * 小于0时不采样压缩. 等于0时自动识别ImageView的宽高和(maxWidth, maxHeight). * * @param width * @param height * @return */ public Builder setSize(int width, int height) { options.width = width; options.height = height; return this; } public Builder setCrop(boolean crop) { options.crop = crop; return this; } public Builder setRadius(int radius) { options.radius = radius; return this; } public Builder setSquare(boolean square) { options.square = square; return this; } public Builder setCircular(boolean circular) { options.circular = circular; return this; } public Builder setAutoRotate(boolean autoRotate) { options.autoRotate = autoRotate; return this; } public Builder setConfig(Bitmap.Config config) { options.config = config; return this; } public Builder setIgnoreGif(boolean ignoreGif) { options.ignoreGif = ignoreGif; return this; } public Builder setLoadingDrawableId(int loadingDrawableId) { options.loadingDrawableId = loadingDrawableId; return this; } public Builder setLoadingDrawable(Drawable loadingDrawable) { options.loadingDrawable = loadingDrawable; return this; } public Builder setFailureDrawableId(int failureDrawableId) { options.failureDrawableId = failureDrawableId; return this; } public Builder setFailureDrawable(Drawable failureDrawable) { options.failureDrawable = failureDrawable; return this; } public Builder setFadeIn(boolean fadeIn) { options.fadeIn = fadeIn; return this; } public Builder setAnimation(Animation animation) { options.animation = animation; return this; } public Builder setPlaceholderScaleType(ImageView.ScaleType placeholderScaleType) { options.placeholderScaleType = placeholderScaleType; return this; } public Builder setImageScaleType(ImageView.ScaleType imageScaleType) { options.imageScaleType = imageScaleType; return this; } public Builder setForceLoadingDrawable(boolean forceLoadingDrawable) { options.forceLoadingDrawable = forceLoadingDrawable; return this; } public Builder setUseMemCache(boolean useMemCache) { options.useMemCache = useMemCache; return this; } public Builder setParamsBuilder(ParamsBuilder paramsBuilder) { options.paramsBuilder = paramsBuilder; return this; } } }