iielse / imageviewer

A simple and customizable Android full-screen image viewer 一个简单且可自定义的Android全屏图像浏览器
MIT License
2.23k stars 310 forks source link

使用默认的loadingUI 图片加载完成后不消失 #64

Closed YuzuWang closed 4 years ago

alongstorm commented 5 years ago

public class DefaultLoadingUIProvider implements ImageWatcher.LoadingUIProvider { final FrameLayout.LayoutParams lpCenterInParent = new FrameLayout.LayoutParams(-2, -2); private Runnable runDelayDisplay;

    public DefaultLoadingUIProvider() {
    }

    public View initialView(Context context) {
        this.lpCenterInParent.gravity = 17;
        ProgressView progressView = new ProgressView(context);
        progressView.setLayoutParams(this.lpCenterInParent);
        return progressView;
    }

    public void start(final View loadView) {
        if (this.runDelayDisplay != null) {
            mHandler.removeCallbacks(this.runDelayDisplay);
        }

        this.runDelayDisplay = new Runnable() {
            public void run() {
                loadView.setVisibility(View.VISIBLE);
                if (!((ProgressView)loadView).isRunning()) {
                    ((ProgressView)loadView).start();
                }

            }
        };
        mHandler.postDelayed(this.runDelayDisplay, 500L);
    }

    public void stop(View loadView) {
        if (this.runDelayDisplay != null) {
            mHandler.removeCallbacks(this.runDelayDisplay);
        }

        this.runDelayDisplay = null;
        if (((ProgressView)loadView).isRunning()) {
            ((ProgressView)loadView).stop();
        }
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                loadView.setVisibility(View.GONE);
                NLog.LogI("PostDetailActivity","loadView set gone");
            }
        },555);
    }
} 
alongstorm commented 5 years ago

start延时执行的,如果加载图片过快会先调用gone,然后visibe出了问题,我把gone也延时执行就没问题了

YuzuWang commented 5 years ago

好的 3q

Liby94 commented 5 years ago

@Edwares @alongstorm 我试了一下延时的代码,发现即使延时也不能解决这个问题,在gif图片下,图片己经完全显示但是还是会显示进度,可以先清楚应用数据,然后打开gif图,这个问题必现。加载失败还会存在error视图和loading视图共存的问题。可以用路由器对手机限速方便复现 我测试时用的时demo3里面的那个gif

Gui-Ji commented 5 years ago

请问这个问题最后解决方法是什么

littlezan commented 5 years ago

我发现问题原因了:库中ProgressView有问题,在设置setVisibility = View.Gone 没有效果,替换成ProgressBar就好了。或者自己定制一个LoadingProvider

iielse commented 4 years ago
interface VHCustomizer {
    fun initialize(type: Int, viewHolder: RecyclerView.ViewHolder) {}
    fun bind(type: Int, data: Photo, viewHolder: RecyclerView.ViewHolder) {}
}
interface ImageLoader {
    fun load(view: ImageView, data: Photo, viewHolder: RecyclerView.ViewHolder)
    fun load(subsamplingView: SubsamplingScaleImageView, data: Photo, viewHolder: RecyclerView.ViewHolder)
}

关于加载的过程.我将Loader的接口进行了调整. 现在框架不关心数据源是什么,也不关心加载过程.全权交给开发者. 你需要实现 VHCustomizer 中重新布局PhotoViewHolder追加自定义元素,比如你的loadingUI. 在ImageLoader load 中去控制 load 的状态表现