最近在开发中,遇到这样的问题:点击用户头像,然后跳转到用户详情页,用户详情页面的背景用用户头像模糊处理后设置进去。
由于用户动态页面的头像都是用fresco通过url加载显示的。所以我必须获取到用户头像在内存中的bitmap。然后才能进行处理。
直接上代码:
public static void getFrescoCacheBitmap(final Handler handler, Uri uri, Context context){
// final Bitmap frescoTepBm;
ImageRequest imageRequest = ImageRequestBuilder
.newBuilderWithSource(uri)
.setProgressiveRenderingEnabled(true)
.build();
ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource<CloseableReference<CloseableImage>>
dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);
dataSource.subscribe(new BaseBitmapDataSubscriber() {
@Override
public void onNewResultImpl(Bitmap bitmap) {
if (bitmap == null) {
// Log.e(TAG,"保存图片失败啦,无法下载图片");
handler.sendEmptyMessage(0);
return;
}
Message message=new Message();
message.obj=bitmap;
handler.sendMessage(message);
}
@Override
public void onFailureImpl(DataSource dataSource) {
handler.sendEmptyMessage(0);
}
}, CallerThreadExecutor.getInstance());
}
解释一下:由于此段代码在获取Bitmap时是异步的,所以要想返回获取到Bitmap,我是利用了Handle对象,在获取到后发送了一个携带Bitmap对象的message,这样在要用到这个bitmap的时候就可以通过handle来获取了。
附上调用此方法的activity中handle对象的声明:
这样基本就完成需求了。。
private Handler handle=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bitmap bitmap = (Bitmap)msg.obj;
if(bitmap!=null){
String filepath=ImageFactory.savePhoto(bitmap, Environment
.getExternalStorageDirectory().getAbsolutePath().toString() + "/clocle/temp_img/","userphoto");
Bitmap userphotoBm=BitmapFactory.decodeFile(filepath);
//Bg_blur.blur(Other_Self_infos.this,bitmap)
//Bg_blur.blur(Other_Self_infos.this,bitmap);
other_self_bg.setImageBitmap(Bg_blur.blur(Other_Self_infos.this,userphotoBm));
//other_self_bg.setImageBitmap(userphotoBm);
}
}
};
参考: