android 之图片加载框架比较

本文对比了三种图片加载库:Picasso、Glide 和 Fresco 的特点及应用场景。Picasso 适用于与 Square 的网络库结合使用;Glide 支持更多图片格式如 GIF,并能根据 ImageView 大小自动调整图片尺寸;Fresco 在 Android 5.0 以下版本提供优秀的内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片加载开源库: https://www.jianshu.com/p/97994c9693f9

     Picasso :和Square的网络库一起能发挥最大作用,因为Picasso可以选择将网络请求的缓存部分交给了okhttp实现。
    
     Glide:模仿了Picasso的API,而且在他的基础上加了很多的扩展(比如gif等支持), Glide默认的Bitmap格式是RGB_565,比      Picasso默认的ARGB_8888格式的内存开销要小一半;Picasso缓存的是全尺寸的(只缓存一种),而Glide缓存的是跟ImageView尺寸相同的(即56*56和128*128是两个缓存) 。

     FB的图片加载框架Fresco:最大的优势在于5.0以下(最低2.3)的bitmap加载。在5.0以下系统,Fresco将图片放到一个特别的内存区域(Ashmem区)。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。为什么说是5.0以下,因为在5.0以后系统默认就是存储在Ashmem区了。


         Picasso所能实现的功能,Glide都能做,无非是所需的设置不同。但是Picasso体积比起Glide小太多如果项目中网络请求本身用的就是okhttp或者retrofit(本质还是okhttp),那么建议用Picasso,体积会小很多(Square全家桶的干活)。Glide的好处是大型的图片流,比如gif、Video,如果你们是做美拍、爱拍这种视频类应用,建议使用。
Fresco在5.0以下的内存优化非常好,代价就是体积也非常的大,按体积算Fresco>Glide>Picasso
不过在使用起来也有些不便(小建议:他只能用内置的一个ImageView来实现这些功能,用起来比较麻烦,我们通常是根据Fresco自己改改,直接使用他的Bitmap层)
========    Picasso

    Button imagebtn;
       ImageView imagev;
        imagebtn = findViewById(R.id.getimage);
        imagev = findViewById(R.id.imagev);
        imagebtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String Url = "http://img.taopic.com/uploads/allimg/140714/234975-140G4155Z571.jp";
//1./从网络下载图片显示
                Picasso
                        .with(getApplicationContext())
                        .load(Url)
                        .into(imagev);

                //2.从网络下载图片设置大小
                Picasso.with(getApplicationContext())
                        .load(Url)
                    //裁剪图片尺寸
                        .resize(100, 100)
                   //设置图片圆角
                        .centerCrop()
                        .into(imagev);

//3.从网络下载图片并显示,如果没有网络图片,则显示占位的图片
                Picasso.with(getApplicationContext())
                        .load(Url)
//加载过程中的图片显示
                        .placeholder(R.drawable.ic_launcher_background)
//加载失败中的图片显示
//如果重试3次(下载源代码可以根据需要修改)还是无法成功加载图片,则用错误占位符图片显示。
                        .error(R.drawable.ic_launcher_foreground)
                        .into(imagev);


//         4. 加载本地的资源或者架子本地的文件
                //加载应用中的资源文件
                Picasso.with(getApplicationContext()).load(R.drawable.ic_launcher_background).into(imagev);
//加载本地文件
                Picasso.with(getApplicationContext()).load(new File("/images/tet.gif")).into(imagev);



            }
        });

=======    Glide

使用参考:https://www.jianshu.com/p/75aa0e4cd33f

需要添加权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
        changgeimage = findViewById(R.id.chageimage);
        imagev = findViewById(R.id.imagv);

        changgeimage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //*************加载网络图片
                String imageUrl = "http://img05.tooopen.com/images/20150820/tooopen_sy_139205349641.jpg";
//                Glide.with(getApplicationContext())
//                        .load(imageUrl)
//                        .into(imagev);


                //***************当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法
//                Glide.with(getApplicationContext()).load(imageUrl).placeholder(R.mipmap.first_newx).into(imagev);

//                **********当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示:
//                Glide.with(getApplicationContext()).load(imageUrl).error(R.mipmap.ic_launcher).into(imagev);


//                ************图片的缩放,centerCrop()和fitCenter()
//                1)使用centerCrop是利用图片图填充ImageView设置的大小,如果ImageView的Height是match_parent则图片就会被拉伸填充,等比例缩放图片,直到图片的狂高都大于等于ImageView的宽度,然后截取中间的显示。
//                Glide.with(getApplicationContext()).load(imageUrl).centerCrop().into(imagev);

//                2)使用fitCenter即缩放图像让图像都测量出来等于或小于 ImageView 的边界范围,该图像将会完全显示,但可能不会填满整个ImageView。等比例缩放图片,宽或者是高等于ImageView的宽或者是高。
//                Glide.with(getApplicationContext()).load(imageUrl).fitCenter().into(imagev);

//               ***********显示gif动画,asGif()判断是否是gif动画
//                Glide.with(getApplicationContext()).load(imageUrl).asGif().into(imagev);

//


//// 加载GIF和视频文件
//
//                //************Fresco支持加载GIF,并且使用的方式和加载图片一样:
//
//                String gifUrl = "http://xx.gif";
//                Glide.with( getApplicationContext() )
//                        .load( gifUrl )
//                        .asGif()
//                        .error(R.mipmap.first_newx )
//                        .into( imagev );
//
//               //******** Glide可以加载视频的缩略图:
//
//                String filePath = "xx.mp4";
//
//                Glide.with( getApplicationContext() )
//                        .load( Uri.fromFile( new File( filePath ) ) )
//                        .into( imagev );
//






//               *********.缓存策略
//
//                Glide.with( getApplicationContext() ).load(imageUrl).skipMemoryCache(true).into(imageViewInternet );//跳过内存缓存
//                Glide.with( getApplicationContext() ).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into( imageViewInternet );//跳过硬盘缓存
//                DiskCacheStrategy.NONE 什么都不缓存
//                DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
//                DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
//                DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)

//              **********.优先级,设置图片加载的顺序:
//                Glide.with(getApplicationContext()).load(imageUrl).priority( Priority.HIGH).into( imagev);


//                //**********加载本地图片,重新设置图片大小
//                Glide.with(getApplicationContext())
//                        .load(R.mipmap.first_newx)
//                 .override(300, 300)
//                        .into(imagev);

               //****************** 从文件中加载图片

//                File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "first_newx.png");
//
//                Glide
//                        .with(getApplicationContext())
//                        .load(file)
//                        .into(imagev);

//               //******************* 从URI中加载图片
//
//                Uri uri = resourceIdToUri(getApplicationContext(), R.mipmap.first_newx);
//
//                Glide
//                        .with(getApplicationContext())
//                        .load(uri)
//                        .into(imagev);



              //*****************  Glide获取Bitmap,Glide通过Target的回调获取Bitmap,最常用的是SimpleTarget:
//
//                private SimpleTarget target = new SimpleTarget<Bitmap>() {
//                    @Override
//                    public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
//                        // do something with the bitmap
//                        // for demonstration purposes, let's just set it to an ImageView
//                        imagev.setImageBitmap( bitmap );
//                    }
//                };
//
//                private void loadImageSimpleTarget() {
//                    Glide
//                            .with( getApplicationContext() ) // could be an issue!
//                            .load( imageurl )
//                            .asBitmap()
//                            .into( target );
//                }

//              **********  设置Bitmap的大小:
//
//                private SimpleTarget target2 = new SimpleTarget<Bitmap>( 250, 250 ) {
//                    @Override
//                    public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
//                        imagev.setImageBitmap( bitmap );
//                    }
//                };
//
//                private void loadImageSimpleTargetApplicationContext() {
//                    Glide
//                            .with( context.getApplicationContext() )
//                            .load( imageurl )
//                            .asBitmap()
//                            .into( target2 );
//                }




            }



        });



========       Fresco

==========SmartImageView

吧com包直接拷贝到工程中;在xml布局中要使用完整的名字:连文件夹的名字也要带上

SmartImageView  sm=(SmartImageView)findViewById();

sm.setImageUrl(imageUrl);//参数是一个图片地址url

==============afinal下载网络图片并加载显示;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值