最近在開發中,遇到這樣的問題:點擊用戶頭像,然後跳轉到用戶詳情頁,用戶詳情頁面的背景用用戶頭像模糊處理後設置進去。
由於用戶動態頁面的頭像都是用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);
}
}
};
參考: