提交 42a41651 编写于 作者: J JessYan

Exclude Glide on arms

上级 f13004d4
......@@ -90,10 +90,7 @@ dependencies {
exclude module: 'okio'
}
api rootProject.ext.dependencies["okhttp3"]
api(rootProject.ext.dependencies["glide"]) {
exclude module: 'support-annotations'
exclude module: 'support-fragment'
}
compileOnly rootProject.ext.dependencies["glide"]
annotationProcessor(rootProject.ext.dependencies["glide-compiler"]) {
exclude module: 'jsr305'
}
......
......@@ -27,7 +27,6 @@ import com.jess.arms.http.log.DefaultFormatPrinter;
import com.jess.arms.http.log.FormatPrinter;
import com.jess.arms.http.log.RequestInterceptor;
import com.jess.arms.http.imageloader.BaseImageLoaderStrategy;
import com.jess.arms.http.imageloader.glide.GlideImageLoaderStrategy;
import com.jess.arms.integration.cache.Cache;
import com.jess.arms.integration.cache.CacheType;
import com.jess.arms.integration.cache.IntelligentCache;
......@@ -129,8 +128,9 @@ public class GlobalConfigModule {
*/
@Singleton
@Provides
@Nullable
BaseImageLoaderStrategy provideImageLoaderStrategy() {
return mLoaderStrategy == null ? new GlideImageLoaderStrategy() : mLoaderStrategy;
return mLoaderStrategy;
}
......
......@@ -16,6 +16,9 @@
package com.jess.arms.http.imageloader;
import android.content.Context;
import android.support.annotation.Nullable;
import com.jess.arms.utils.Preconditions;
import javax.inject.Inject;
import javax.inject.Singleton;
......@@ -35,6 +38,7 @@ import javax.inject.Singleton;
@Singleton
public final class ImageLoader {
@Inject
@Nullable
BaseImageLoaderStrategy mStrategy;
@Inject
......@@ -50,6 +54,7 @@ public final class ImageLoader {
* @param <T>
*/
public <T extends ImageConfig> void loadImage(Context context, T config) {
Preconditions.checkNotNull(mStrategy, "Please implement BaseImageLoaderStrategy and call GlobalConfigModule.Builder#imageLoaderStrategy(BaseImageLoaderStrategy) in the applyOptions method of ConfigModule");
this.mStrategy.loadImage(context, config);
}
......@@ -61,6 +66,7 @@ public final class ImageLoader {
* @param <T>
*/
public <T extends ImageConfig> void clear(Context context, T config) {
Preconditions.checkNotNull(mStrategy, "Please implement BaseImageLoaderStrategy and call GlobalConfigModule.Builder#imageLoaderStrategy(BaseImageLoaderStrategy) in the applyOptions method of ConfigModule");
this.mStrategy.clear(context, config);
}
......@@ -70,9 +76,11 @@ public final class ImageLoader {
* @param strategy
*/
public void setLoadImgStrategy(BaseImageLoaderStrategy strategy) {
Preconditions.checkNotNull(strategy, "strategy == null");
this.mStrategy = strategy;
}
@Nullable
public BaseImageLoaderStrategy getLoadImgStrategy() {
return mStrategy;
}
......
/*
* Copyright 2017 JessYan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jess.arms.http.imageloader.glide;
import android.graphics.Bitmap;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import com.bumptech.glide.load.Key;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import com.jess.arms.utils.FastBlur;
import java.security.MessageDigest;
/**
* ================================================
* 高斯模糊
* <p>
* Created by JessYan on 03/04/2018 15:14
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* ================================================
*/
public class BlurTransformation extends BitmapTransformation {
private static final String ID = BlurTransformation.class.getName();
private static final byte[] ID_BYTES = ID.getBytes(Key.CHARSET);
public static final int DEFAULT_RADIUS = 15;
private int mRadius = DEFAULT_RADIUS;
public BlurTransformation(@IntRange(from = 0) int radius) {
mRadius = radius;
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
messageDigest.update(ID_BYTES);
}
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
return FastBlur.doBlur(toTransform, mRadius, true);
}
@Override
public boolean equals(Object o) {
return o instanceof BlurTransformation;
}
@Override
public int hashCode() {
return ID.hashCode();
}
}
......@@ -53,7 +53,7 @@ public class GlideConfiguration extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
AppComponent appComponent = ArmsUtils.obtainAppComponentFromContext(context);
final AppComponent appComponent = ArmsUtils.obtainAppComponentFromContext(context);
builder.setDiskCache(new DiskCache.Factory() {
@Override
public DiskCache build() {
......@@ -76,7 +76,7 @@ public class GlideConfiguration extends AppGlideModule {
//并不能满足自己的需求,想自定义 BaseImageLoaderStrategy,那请你最好实现 GlideAppliesOptions
//因为只有成为 GlideAppliesOptions 的实现类,这里才能调用 applyGlideOptions(),让你具有配置 Glide 的权利
BaseImageLoaderStrategy loadImgStrategy = appComponent.imageLoader().getLoadImgStrategy();
if (loadImgStrategy instanceof GlideAppliesOptions) {
if (loadImgStrategy != null && loadImgStrategy instanceof GlideAppliesOptions) {
((GlideAppliesOptions) loadImgStrategy).applyGlideOptions(context, builder);
}
}
......
/*
* Copyright 2017 JessYan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jess.arms.http.imageloader.glide;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.jess.arms.di.module.GlobalConfigModule;
import com.jess.arms.http.imageloader.BaseImageLoaderStrategy;
import com.jess.arms.http.imageloader.ImageConfig;
import com.jess.arms.utils.Preconditions;
import io.reactivex.Completable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Action;
import io.reactivex.schedulers.Schedulers;
import timber.log.Timber;
/**
* ================================================
* 此类只是简单的实现了 Glide 加载的策略,方便快速使用,但大部分情况会需要应对复杂的场景
* 这时可自行实现 {@link BaseImageLoaderStrategy} 和 {@link ImageConfig} 替换现有策略
*
* @see GlobalConfigModule.Builder#imageLoaderStrategy(BaseImageLoaderStrategy)
* Created by JessYan on 8/5/16 16:28
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* ================================================
*/
public class GlideImageLoaderStrategy implements BaseImageLoaderStrategy<ImageConfigImpl>, GlideAppliesOptions {
@Override
public void loadImage(Context ctx, ImageConfigImpl config) {
Preconditions.checkNotNull(ctx, "Context is required");
Preconditions.checkNotNull(config, "ImageConfigImpl is required");
Preconditions.checkNotNull(config.getImageView(), "ImageView is required");
GlideRequests requests;
requests = GlideArms.with(ctx);//如果context是activity则自动使用Activity的生命周期
GlideRequest<Drawable> glideRequest = requests.load(config.getUrl());
switch (config.getCacheStrategy()) {//缓存策略
case 0:
glideRequest.diskCacheStrategy(DiskCacheStrategy.ALL);
break;
case 1:
glideRequest.diskCacheStrategy(DiskCacheStrategy.NONE);
break;
case 2:
glideRequest.diskCacheStrategy(DiskCacheStrategy.RESOURCE);
break;
case 3:
glideRequest.diskCacheStrategy(DiskCacheStrategy.DATA);
break;
case 4:
glideRequest.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC);
break;
default:
glideRequest.diskCacheStrategy(DiskCacheStrategy.ALL);
break;
}
if (config.isCrossFade()) {
glideRequest.transition(DrawableTransitionOptions.withCrossFade());
}
if (config.isCenterCrop()) {
glideRequest.centerCrop();
}
if (config.isCircle()) {
glideRequest.circleCrop();
}
if (config.isImageRadius()) {
glideRequest.transform(new RoundedCorners(config.getImageRadius()));
}
if (config.isBlurImage()) {
glideRequest.transform(new BlurTransformation(config.getBlurValue()));
}
if (config.getTransformation() != null) {//glide用它来改变图形的形状
glideRequest.transform(config.getTransformation());
}
if (config.getPlaceholder() != 0)//设置占位符
glideRequest.placeholder(config.getPlaceholder());
if (config.getErrorPic() != 0)//设置错误的图片
glideRequest.error(config.getErrorPic());
if (config.getFallback() != 0)//设置请求 url 为空图片
glideRequest.fallback(config.getFallback());
glideRequest
.into(config.getImageView());
}
@Override
public void clear(final Context ctx, ImageConfigImpl config) {
Preconditions.checkNotNull(ctx, "Context is required");
Preconditions.checkNotNull(config, "ImageConfigImpl is required");
if (config.getImageView() != null) {
GlideArms.get(ctx).getRequestManagerRetriever().get(ctx).clear(config.getImageView());
}
if (config.getImageViews() != null && config.getImageViews().length > 0) {//取消在执行的任务并且释放资源
for (ImageView imageView : config.getImageViews()) {
GlideArms.get(ctx).getRequestManagerRetriever().get(ctx).clear(imageView);
}
}
if (config.isClearDiskCache()) {//清除本地缓存
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
Glide.get(ctx).clearDiskCache();
}
}).subscribeOn(Schedulers.io()).subscribe();
}
if (config.isClearMemory()) {//清除内存缓存
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
Glide.get(ctx).clearMemory();
}
}).subscribeOn(AndroidSchedulers.mainThread()).subscribe();
}
}
@Override
public void applyGlideOptions(Context context, GlideBuilder builder) {
Timber.w("applyGlideOptions");
}
}
/*
* Copyright 2017 JessYan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jess.arms.http.imageloader.glide;
import android.widget.ImageView;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import com.jess.arms.http.imageloader.BaseImageLoaderStrategy;
import com.jess.arms.http.imageloader.ImageConfig;
import com.jess.arms.http.imageloader.ImageLoader;
/**
* ================================================
* 这里存放图片请求的配置信息,可以一直扩展字段,如果外部调用时想让图片加载框架
* 做一些操作,比如清除缓存或者切换缓存策略,则可以定义一个 int 类型的变量,内部根据 switch(int) 做不同的操作
* 其他操作同理
* <p>
* Created by JessYan on 8/5/16 15:19
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* ================================================
*/
public class ImageConfigImpl extends ImageConfig {
private int cacheStrategy;//0对应DiskCacheStrategy.all,1对应DiskCacheStrategy.NONE,2对应DiskCacheStrategy.SOURCE,3对应DiskCacheStrategy.RESULT
private int fallback; //请求 url 为空,则使用此图片作为占位符
private int imageRadius;//图片每个圆角的大小
private int blurValue;//高斯模糊值, 值越大模糊效果越大
/**
* @see {@link Builder#transformation(BitmapTransformation)}
*/
@Deprecated
private BitmapTransformation transformation;//glide用它来改变图形的形状
private ImageView[] imageViews;
private boolean isCrossFade;//是否使用淡入淡出过渡动画
private boolean isCenterCrop;//是否将图片剪切为 CenterCrop
private boolean isCircle;//是否将图片剪切为圆形
private boolean isClearMemory;//清理内存缓存
private boolean isClearDiskCache;//清理本地缓存
private ImageConfigImpl(Builder builder) {
this.url = builder.url;
this.imageView = builder.imageView;
this.placeholder = builder.placeholder;
this.errorPic = builder.errorPic;
this.fallback = builder.fallback;
this.cacheStrategy = builder.cacheStrategy;
this.imageRadius = builder.imageRadius;
this.blurValue = builder.blurValue;
this.transformation = builder.transformation;
this.imageViews = builder.imageViews;
this.isCrossFade = builder.isCrossFade;
this.isCenterCrop = builder.isCenterCrop;
this.isCircle = builder.isCircle;
this.isClearMemory = builder.isClearMemory;
this.isClearDiskCache = builder.isClearDiskCache;
}
public int getCacheStrategy() {
return cacheStrategy;
}
public BitmapTransformation getTransformation() {
return transformation;
}
public ImageView[] getImageViews() {
return imageViews;
}
public boolean isClearMemory() {
return isClearMemory;
}
public boolean isClearDiskCache() {
return isClearDiskCache;
}
public int getFallback() {
return fallback;
}
public int getBlurValue() {
return blurValue;
}
public boolean isBlurImage() {
return blurValue > 0;
}
public int getImageRadius() {
return imageRadius;
}
public boolean isImageRadius() {
return imageRadius > 0;
}
public boolean isCrossFade() {
return isCrossFade;
}
public boolean isCenterCrop() {
return isCenterCrop;
}
public boolean isCircle() {
return isCircle;
}
public static Builder builder() {
return new Builder();
}
public static final class Builder {
private String url;
private ImageView imageView;
private int placeholder;
private int errorPic;
private int fallback; //请求 url 为空,则使用此图片作为占位符
private int cacheStrategy;//0对应DiskCacheStrategy.all,1对应DiskCacheStrategy.NONE,2对应DiskCacheStrategy.SOURCE,3对应DiskCacheStrategy.RESULT
private int imageRadius;//图片每个圆角的大小
private int blurValue;//高斯模糊值, 值越大模糊效果越大
/**
* @see {@link Builder#transformation(BitmapTransformation)}
*/
@Deprecated
private BitmapTransformation transformation;//glide用它来改变图形的形状
private ImageView[] imageViews;
private boolean isCrossFade;//是否使用淡入淡出过渡动画
private boolean isCenterCrop;//是否将图片剪切为 CenterCrop
private boolean isCircle;//是否将图片剪切为圆形
private boolean isClearMemory;//清理内存缓存
private boolean isClearDiskCache;//清理本地缓存
private Builder() {
}
public Builder url(String url) {
this.url = url;
return this;
}
public Builder placeholder(int placeholder) {
this.placeholder = placeholder;
return this;
}
public Builder errorPic(int errorPic) {
this.errorPic = errorPic;
return this;
}
public Builder fallback(int fallback) {
this.fallback = fallback;
return this;
}
public Builder imageView(ImageView imageView) {
this.imageView = imageView;
return this;
}
public Builder cacheStrategy(int cacheStrategy) {
this.cacheStrategy = cacheStrategy;
return this;
}
public Builder imageRadius(int imageRadius) {
this.imageRadius = imageRadius;
return this;
}
public Builder blurValue(int blurValue) { //blurValue 建议设置为 15
this.blurValue = blurValue;
return this;
}
/**
* 给图片添加 Glide 独有的 BitmapTransformation
* <p>
* 因为 BitmapTransformation 是 Glide 独有的类, 所以如果 BitmapTransformation 出现在 {@link ImageConfigImpl} 中
* 会使 {@link ImageLoader} 难以切换为其他图片加载框架, 在 {@link ImageConfigImpl} 中只能配置基础类型和 Android 包里的类
* 此 API 会在后面的版本中被删除, 请使用其他 API 替代
*
* @param transformation {@link BitmapTransformation}
* @deprecated 请使用 {@link #isCircle()}, {@link #isCenterCrop()}, {@link #isImageRadius()} 替代
* 如果有其他自定义 BitmapTransformation 的需求, 请自行扩展 {@link BaseImageLoaderStrategy}
*/
@Deprecated
public Builder transformation(BitmapTransformation transformation) {
this.transformation = transformation;
return this;
}
public Builder imageViews(ImageView... imageViews) {
this.imageViews = imageViews;
return this;
}
public Builder isCrossFade(boolean isCrossFade) {
this.isCrossFade = isCrossFade;
return this;
}
public Builder isCenterCrop(boolean isCenterCrop) {
this.isCenterCrop = isCenterCrop;
return this;
}
public Builder isCircle(boolean isCircle) {
this.isCircle = isCircle;
return this;
}
public Builder isClearMemory(boolean isClearMemory) {
this.isClearMemory = isClearMemory;
return this;
}
public Builder isClearDiskCache(boolean isClearDiskCache) {
this.isClearDiskCache = isClearDiskCache;
return this;
}
public ImageConfigImpl build() {
return new ImageConfigImpl(this);
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册