首页 > 学院 > 开发设计 > 正文

Picasso图片加载框架的使用及加载网络图片等比例缩放

2019-11-09 16:34:16
字体:
来源:转载
供稿:网友

在平时开发中,常需要从网络上获取图片到本地保存或显示,在初学Android时,第一次接触到这个技术是从请求网络开始,然后把图片以流的形式保存到Bitmap对象中进行显示。 然而上述过程太过繁琐,还要编写代码处理图片缓存等操作,最近在做项目的过程中就接触到了一种简单而优雅的图片加载框架,只需以下一行代码便可加载图片。

Picasso.with(context).load(url).into(imageView);

通过查看源码可知:上述代码load中的参数除了是String类型的地址外,还可直接是Uri,File对象以及资源文件id

使用Picasso要先在项目的build.gradle中添加依赖

compile 'it.sephiroth.android.library.picasso:picasso:2.5.2.4b'

然后你就可以尽情享受Picasso给你带来的轻松愉快的编码感受。

除上述最简单的使用方法之外,Picasso还提供了更多强大的功能, 例如图片裁剪:

Picasso.with( imageView.getContext() ).load(url).resize(width,height).centerCrop().into(imageView);

**Picasso可以设置占位图片:指的是图片未正常显示时所显示的图片 也可以设置显示错误时的图片**

Picasso.with(context).load(url).placeholder(R.drawable.placeholder).error(R.drawable.error).into(imageView);

另外Picasso提供了以下的方法用于设置图片加载的优先级

public RequestCreator PRiority(Priority priority) { this.data.priority(priority); return this; }

其中参数可传Picasso.Priority.HIGH,Picasso.Priority.NORMAL,Picasso.Priority.LOW 设置优先级加载的步骤为:

Picasso.with(context) .load(url) .priority(Picasso.Priority.NORMAL) .into(imageView);

设置了优先级的图片并不保证一定会优先加载,只能说倾向于优先加载。

在开发中,我们也经常遇到所加载的图片进行了拉伸,这是我们所不愿意看到的,那么怎么做才能让我们的图片根据屏幕宽度进行等比例缩放呢? 传统的设置方法往往比较复杂,但是用Picasso框架省略了一系列操作,只要调用Picasso的transform方法,传入Transformation对象即可,我们需要对Transformation可进行以下操作: 新建一个类实现Transformaotion接口

public class PicassoTransformation implements it.sephiroth.android.library.picasso.Transformation { int screenWidth; double targetWidth; /** * @param view 为了得到contenxt对象获得屏幕宽度 * @param aver 根据屏幕宽度进行的等分 */ public PicassoTransformation(View view, int aver){ WindowManager wm = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE); DisplayMetrics displayMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(displayMetrics); //获得屏幕宽度 screenWidth = displayMetrics.widthPixels; targetWidth = screenWidth/aver; } @Override public Bitmap transform(Bitmap bitmap) { if (bitmap.getWidth() == 0 || bitmap.getHeight() == 0) { return bitmap; } //得到图片宽高比,每个参数必须强转成double型 double ratio = (double) bitmap.getWidth() / (double) bitmap.getHeight(); Bitmap bitmapResult=null; if(bitmap!=null){ bitmapResult = Bitmap.createScaledBitmap(bitmap, (int) (targetWidth+0.5), (int) ((targetWidth / ratio)+0.5), false); } if (bitmap != bitmapResult) { bitmap.recycle(); } return bitmapResult; } @Override public String key() { return "transformation" + screenWidth ; }}

其中需要重写其两个方法: public Bitmap transform(Bitmap bitmap){} public String key(){}

在transform方法中,我们需要先判断其bitmap对象的宽度或高度是否等于0,若是,则直接返回bitmap对象。 获得bitmap的宽高比的同时,要特别注意宽度和高度要先强转成double型,因为bitmap默认的宽度和高度为int型,两个int型的数直接相除为int型,这时候再转成double型数据精度会丢失。我就在做项目的时候犯了这个错,结果调用这段代码程序就出现闪退。

在完成Transformation类的编写之后,我们就可以使用其对象使图片根据屏幕宽度进行等比例缩放了。

Transformation transformation = new PicassoTransformation(view, aver);Picasso.with(view.getContext()).load(url) .transform(transformation) .into(imageview);

看完上述代码是不是觉得Picasso这个框架既简单又好用呢,不用回答,我就是这么认为的。

这里传一张我在项目中使用Picasso加载网络图片进行等比例缩放的截图: 这里写图片描述


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表