用Picasso加载图片只有URL和URI两种方式,通过path或file都是转成URI再进行加载的。其实还有一种自定义加载的方式,即去继承RequestHandler,就可以通过流或者Bitmap就行加载了。
通过Bitmap加载是因为要加载视频缩略图。
public class VideoRequestHandler extends RequestHandler {
public String SCHEME_VIDEO = "video";
@Override
public boolean canHandleRequest(Request data) {
String scheme = data.uri.getScheme();
return (SCHEME_VIDEO.equals(scheme));
}
@Override
public synchronized Result load(Request data, int arg1) throws IOException {
Bitmap bm = ThumbnailUtils.createVideoThumbnail(data.uri.getPath(), MediaStore.Images.Thumbnails.MINI_KIND);
return new Result(bm, Picasso.LoadedFrom.DISK);
}
}
这里继承RequestHandler类,canHandleRequest()返回的是否要使用这种加载方法,通过uri的头是否是这里定义的SCHEME_VIDEO进行判断。load方法,通过
ThumbnailUtils.createVideoThumbnail方法获取到bitmap,返回返回其组成的Result。
使用也很简单。先配置进picasso对象:
videoRequestHandler = new VideoRequestHandler();
mPicasso = new Picasso.Builder(getApplicationContext())
.listener(new Picasso.Listener() {
@Override
public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
String s = "";
s.length();
}
})
.addRequestHandler(videoRequestHandler)
.build();
load时uri加上这个自定义的头就行了:
mPicasso.load(videoRequestHandler.SCHEME_VIDEO + ":" + videoPath).
resize(mImageSize, mImageSize).
placeholder(R.drawable.pic_load).
error(R.drawable.video_fail).
centerCrop().
into(holder.mImageView, callback);
再介绍一个通过流加载的,这里是因为把图片进行了加密,直接加载不出来,解析文件出来再加载就太麻烦了,只能通过先解析出流,直接加载流图片。
public class FilexRequestHandler extends RequestHandler {
public static final String SCHEMA_FILEX = "filexm";
private static final int PREFIX_LENGTH = SCHEMA_FILEX.length() + 3; // filexm://
@Override
public boolean canHandleRequest(Request data) {
return SCHEMA_FILEX.equals(data.uri.getScheme()) &&
!data.uri.getPathSegments().isEmpty();
}
@Override
public Result load(Request request, int networkPolicy) throws IOException {
String filepath = request.uri.toString().substring(PREFIX_LENGTH);
File file = new File(filepath);
InputStream inputStream = FilexHelper.decodeStream(new FileInputStream(file), file.length());
return new Result(inputStream, DISK);
}
}
Requesthandler也是一样,通过一个前缀判断,load时先把前缀去掉了,再解析出解密的流,再返回流组成的Result就行了。
使用方法也是先加配置,不过这里用的是PicassoPlus:
PicassoPlus.addRequestHandler(new FilexRequestHandler());
加载方法:PicassoPlus.with(EditImagesActivity.this).
load(FilexHelper.genFilxLoadUri(file)).
resize(size, size).
placeholder(R.drawable.pic_load).
error(R.drawable.pic_fail).
centerCrop().
into(holder.mImageView);
除了改成PicassoPlus,其它和普通加载都是一样的,就是uri不一样:
/**
* 获取picasso加载的uri
* @param file
* @return
*/
public static String genFilxLoadUri(File file) {
return "filexm://" + file.getAbsolutePath();
}
还是一个头加加一个路径。
这种加载方式还是挺不错的,不过一般很少碰到这样的需求,挺难用到的。这次我居然用到了两个,真是麻烦的项目。