GithubHelp home page GithubHelp logo

sunfusheng / glideimageview Goto Github PK

View Code? Open in Web Editor NEW
1.8K 37.0 273.0 12.29 MB

基于Glide V4.9.0封装的图片加载库,可以监听加载图片时的进度

Home Page: https://github.com/sunfusheng/GlideImageView

Java 100.00%
glide glideimageview progressview shapeimageview imageloader glideimageloader

glideimageview's Introduction

GlideImageView Download

该库是基于Glide V4.9.0设计的,实现如下特性:

1、监听加载网络图片的进度
2、动态加载成有弧度的图片、圆形图片、高斯模糊图片更方便
3、链式设置触摸图片的透明度和非使能的透明度
4、增加九宫格控件,具体使用参考NineImageViewActivity


监听加载高清图片进度的效果图


APK下载地址,去手机上体验吧 (◐‿◑)


具体使用说明如下

Gradle:

compile 'com.sunfusheng:GlideImageView:<latest-version>'

GlideImageView 主要方法

load(String url, @DrawableRes int placeholder, int radius, OnProgressListener onProgressListener)

load(Object obj, @DrawableRes int placeholder, Transformation<Bitmap> transformation, OnProgressListener onProgressListener)

loadCircle(String url, @DrawableRes int placeholder, OnProgressListener onProgressListener)

loadDrawable(@DrawableRes int resId, @DrawableRes int placeholder)

个人微信公众号


关于我

GitHub: sunfusheng

个人邮箱: [email protected]

个人博客: sunfusheng.com

简书主页

新浪微博

glideimageview's People

Contributors

sunfusheng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

glideimageview's Issues

recyclerview中使用

在recyclerview的item里使用,会抢占item的点击事件,怎么取消该图片区域触摸

圆形大尺寸图片不会居中

<com.sunfusheng.glideimageview.ShapeImageView android:layout_width="@dimen/dimen_dp_80" android:layout_height="@dimen/dimen_dp_80" android:layout_centerHorizontal="true" android:scaleType="centerCrop" android:src="@mipmap/timg" app:siv_border_width="@dimen/dimen_dp_2" app:siv_shape_type="circle" />
如果图片尺寸过大 不会自动居中 所以只好自己手动改造代码 实现居中 并且android:scaleType 设置center会出现border与图片错位 因该是没有处理这些状态 如果能加上这些东东就完美了

崩溃

abstract method "com.bumptech.glide.RequestManager com.bumptech.glide.manager.RequestManagerRetriever$RequestManagerFactory.build(com.bumptech.glide.Glide, com.bumptech.glide.manager.Lifecycle, com.bumptech.glide.manager.RequestManagerTreeNode, android.content.Context)"

调用以下代码崩溃:
final RequestBuilder requestBuilder = imageLoader.requestBuilder(imgUrl, options);
requestBuilder.transition(DrawableTransitionOptions.withCrossFade())
.into(new SimpleTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
@OverRide
public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
if (resource.getIntrinsicHeight() > DisplayUtil.getScreenHeight(mActivity)) {
mIvPic.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
requestBuilder.into(mIvPic);
}
});

GlideImageLoader.java

if (url.startsWith(HTTP) || url.startsWith(HTTPS))
话说第二个条件能走进去吗?

九宫格控件奔溃问题

Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference

android.view.ViewGroup.dispatchDraw(ViewGroup.java:4021) -------->这是报错
我把dispatchDraw 里代码全部注释还是报错在小米mix2s上还是直接奔溃

RecyclerView 中加载glideImageView 过多 导致内存溢出,怎么解决一下?

问题指向shapeImageView 中的 drawDrawable()方法 的 bitmap缩放的时候。
//Bitmap缩放
float scaleWidth = ((float) getWidth()) / bitmap.getWidth();
float scaleHeight = ((float) getHeight()) / bitmap.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
canvas.drawBitmap(bitmap, 0, 0, paint);
canvas.restore();

ProgressManager 中的LIst 改为 Map 是不是更好一点呢? url 做 key

public class ProgressManager {

private static Map<String, WeakReference<OnProgressListener>> listenersMap = Collections.synchronizedMap(new HashMap<String, WeakReference<OnProgressListener>>());
private static OkHttpClient okHttpClient;

private ProgressManager() {
}

public static OkHttpClient getOkHttpClient() {
    if (okHttpClient == null) {
        okHttpClient = new OkHttpClient.Builder()
                .addNetworkInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(@NonNull Chain chain) throws IOException {
                        Request request = chain.request();
                        Response response = chain.proceed(request);
                        return response.newBuilder()
                                .body(new ProgressResponseBody(request.url().toString(), response.body(), listenersMap.get(request.url().toString()).get()))
                                .build();
                    }
                })
                .build();
    }
    return okHttpClient;
}

// private static final OnProgressListener LISTENER = new OnProgressListener() {
// @OverRide
// public void onProgress(String imageUrl, long bytesRead, long totalBytes, boolean isDone, GlideException exception) {
// if (listenersMap == null || listenersMap.size() == 0) return;
// for (int i = 0; i < listenersMap.size(); i++) {
// WeakReference listener = listenersMap.get(i);
// OnProgressListener progressListener = listener.get();
// if (progressListener == null) {
// listenersMap.remove(i);
// } else {
// progressListener.onProgress(imageUrl, bytesRead, totalBytes, isDone, exception);
// }
// }
// }
// };

/**
 * 使用URL做key 保存在map中
 * @param key
 * @param progressListener
 */
public static void addProgressListener(String key, OnProgressListener progressListener) {
    if (progressListener == null || TextUtils.isEmpty(key)) return;

    if (!listenersMap.containsKey(key)) {
        listenersMap.put(key, new WeakReference<>(progressListener));
    }
}

public static void removeProgressListener(String key, OnProgressListener progressListener) {
    if (progressListener == null || TextUtils.isEmpty(key)) return;
    listenersMap.remove(key);
}

// private static WeakReference findProgressListener(OnProgressListener listener) {
// if (listener == null) return null;
// if (listenersMap == null || listenersMap.size() == 0) return null;
//
// for (int i = 0; i < listenersMap.size(); i++) {
// WeakReference progressListener = listenersMap.get(i);
// if (progressListener.get() == listener) {
// return progressListener;
// }
// }
// return null;
// }

}

在RecyclerView中加载,尺寸变化。

RecyclerView列表中使用时,滑出屏幕再滑动回来,ImageView尺寸发生变化,第一次加载无问题,复用会导致图片比例失调,并且图片会变得比第一次模糊,布局没有固定宽高,我加载的长图。

onProgress 重复调用

源码中ProgressManager.java
private static final OnProgressListener LISTENER = new OnProgressListener() {
@OverRide
public void onProgress(String imageUrl, long bytesRead, long totalBytes, boolean isDone, GlideException exception) {
if (listeners == null || listeners.size() == 0) return;

        for (int i = 0; i < listeners.size(); i++) {
            WeakReference<OnProgressListener> listener = listeners.get(i);
            OnProgressListener progressListener = listener.get();
            if (progressListener == null) {
                listeners.remove(i);
            } else {
                **_progressListener.onProgress(imageUrl, bytesRead, totalBytes, isDone, exception);_**
            }
        }
    }
};

listeners中包含多个时会导致调用多次

1.2.0的版本运行Sample gIf不动。

请问作者,1.2.0相比1.1.0做了哪些改动。1.1.0的sample,GildeImageView和普通的Imageview都能正常加载Gif,但是1.2.0的GlideImageView加载Gif无论是从网络还是本地,都无法动起来,但是Imageview用
GlideImageLoader.create(image32).load(gif1, new RequestOptions());这个方法还是能正常加载显示出来。请问问题出在哪里了?

你好作者,我提几个跟内存有关的问题

1。ShapeImageView 的使用存在过渡的绘制,特别是在稍微低端的机子上很很卡,
2。GlideImageLoader 里面 Glide.with(getContext()) 中的context 使用 当前界面(activity,或者fragment)的context。不然内存释放不了。
这些都是我经过多次测试发现的,不知道你有没有发现。

同时也谢谢你提供的这个封装的库,辛苦了。

引入包后出现问题

正常项目
添加compile 'com.sunfusheng:GlideImageView:2.0.0后编译时出现
Error:In FontFamilyFont, unable to find attribute android:font
Error:In FontFamilyFont, unable to find attribute android:fontWeight
Error:Execution failed for task ':app:processDebugResources'.

com.android.ide.common.process.ProcessException: Failed to execute aapt

GlideImageView过度动画问题

添加过度动画后transition(DrawableTransitionOptions.withCrossFade()),图片加载不会显示,你的demo就有这个问题,在方法private void line42()中,使用Imageview过渡动画就没问题,应该还是ShapeImageView封装的有冲突

功能扩展,

浏览单张大图时希望加上双击放大,还有双指缩放,就可以不用去依赖其他的库了

xml加载圆形图片

一定要代码调用loadCircleImageView才能有圆形效果吗,能不能在xml直接设置就生效

能不能把 library 中的 ProgressAppGlideModule 类改成继承 LibraryGlideModule

能不能把 library 中的 ProgressAppGlideModule 类改成继承 LibraryGlideModule, 因为 可能使用的时候项目需要配置自己的 GlideModule 类,以下是官方文档的建议

程序库 (Libraries)
程序库如果需要注册定制组件,例如 ModelLoader,可按以下步骤执行:
添加一个或多个 LibraryGlideModule 实现,以注册新的组件。
为每个 LibraryGlideModule 实现,添加 @GlideModule 注解。
添加 Glide 的注解处理器的依赖。
一个 [LibraryGlideModule] 的例子,在 Glide 的OkHttp 集成库 中:

@GlideModule
public final class OkHttpLibraryGlideModule extends LibraryGlideModule {
@OverRide
public void registerComponents(Context context, Glide glide, Registry registry) {
registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
}
}
使用 GlideModule 注解需要使用 Glide 注解的依赖:

compile 'com.github.bumptech.glide:annotations:4.6.1'
避免在程序库中使用 AppGlideModule
程序库一定 不要 包含 AppGlideModule 实现。这么做将会阻止依赖该库的任何应用程序管理它们的依赖,或配置诸如 Glide 缓存大小和位置之类的选项。

此外,如果两个程序库都包含 AppGlideModule,应用程序将无法在同时依赖两个库的情况下通过编译,而不得不在二者之中做出取舍。

这确实意味着程序库将无法使用 Glide 的 generated API,但是使用 RequestOptions 加载仍然有效

集成的时候报错,项目是用jdk1.7? 能不能更新一下

Error:Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
This is caused by library dependencies that have been compiled using Java 8 or above.
If you are using the 'java' gradle plugin in a library submodule add
targetCompatibility = '1.7'
sourceCompatibility = '1.7'
to that submodule's build.gradle file.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.