为了账号安全,请及时绑定邮箱和手机立即绑定

实现微信图片加载显示进度效果->Drawable注入

标签:
Android

分析

从网络上加载图片是一种耗时的操作,当加载的图片体积越大,消耗的时间也会更长。向ImageView添加一个进度条的话,可以起到一定的效果。而在我们Android里面,据我了解,想实现ImageView添加进度条的方法有两种:
1.新建一个类extends ImageView,在draw()方法里面画进度。
2.可以在你的ImageView外围添加RelativeLayout,然后,在里面加多一个ProgressBar。

LoadingProgress用的都不是以上两种方法。而是采用了extends Drawable的形式,然后注入到ImageView图层上面。

对比

先从上面第二种来说,在外围嵌套RelativeLayout再放多一个ProgressBar,如果在ListView里面这样来写的话,性能绝对会受到影响,因为多绘制两个控件,Android就要多点耗时时间,内存也会占用。
第一种和我的那种对比的话,我的那种可能会相对占用一点内存,但是相对的,灵活性和扩展性就高了,为什么这样说呢?比如,你有时候需要用到手势缩放这种Extends ImageView的控件,总不可能继承与手势缩放,再重新封装代码对吧?
我的只要是继承于ImageView和可以监听到下载图片进度的回调,都可以实现像QQ和微信那种加载进度条,可以动态的调整圆环大小和字体大小,颜色和其他的。

用法

    //用法也是挺简单的,只需要几行代码
    CircleProgress progress = new CircleProgress.Builder()    
    // .....从建造者里面设置你的属性,园底层颜色,进度颜色,字体大小颜色等..
                        .build();//返回CircleProgress


    /**********
    * 如果你不想圆形进度条,你可以使用其他的进度条
    * 比如:RectangleProgress(长形进度条)
    * RotateProgress(实现自动旋转的进度条)
    * LevelProgress(这个我也不好解析,类似效果图水杯的那种效果)
    */
    //对于使用Fresco框架的
    progress.injectFresco(target);//SimpledraweeView
    //除了Fresco框架其他的,均使用这个方法
    progress.inject(target);//target为你的ImageView
    //接着加载你的图片把

</t></t>最后,你需要监听到图片下载进度变化的事件,Fresco框架的不需要。

在你的进度回调方法里面:

    @Override
    public void update(long current,long total){        //当前进度值
        progress.setLevel((int)current);        //最大进度值
        progress.setMaxValue(total);
    }

对于使用Glide和Picasso框架的人来说,获取进度变化的回调可能会有点困难,不过可参考我的DEMO,使用Okhttp3拦截进度事件,不过也有点问题,特别大的图片加载不出来,我也不太了解OKhttp3进度获取,希望有人能指点一下我!

原文链接:http://www.apkbus.com/blog-862352-62117.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消