桌面的模糊,比較蛋疼。效率一直是一個問題,因爲桌面要合成壁紙+桌面+模糊。
我的做法如下:
1、拿到桌面的View,通過View獲取到圖片Bitmap(這個是整個桌面當前可見的緩存圖片,並且對圖片進行按比例縮放,降低圖片的質量)
2、拿到當前壁紙圖片(需要對壁紙進行當前屏幕裁剪,因爲壁紙是滾動的,還有適當進行圖片壓縮)
3、將拿到的桌面Bimap 和壁紙Bitmap 2張圖進行合成一張,最後,將這張圖進行高斯模糊。
代碼如下:
Bitmap mBlurBitmap=null;
Canvas mCanvas=null;
Paint drawPaint=null;
float scaleFactor = 12;
int radius = 5;
public boolean blurLayout(){
long startTime = System.nanoTime(); //開始時間
if(mBlurBitmap==null) {
if(getWidth()<=0||getHeight()<=0){
return false;
}
mBlurBitmap = Bitmap.createBitmap((int)(getMeasuredWidth()/scaleFactor), (int)(getMeasuredHeight()/scaleFactor), Bitmap.Config.ARGB_4444);
}
mBlurBitmap.eraseColor(Color.TRANSPARENT);
if(mCanvas==null){
mCanvas=new Canvas(mBlurBitmap);
}
if(drawPaint==null){
drawPaint=new Paint();
// drawPaint.setStyle(Paint.Style.FILL);
drawPaint.setFlags(Paint.FILTER_BITMAP_FLAG);
}
Bitmap mWallpaperBitmap=getWallpaper();
if(mWallpaperBitmap==null){
return false;
}
mCanvas.save();
mCanvas.clipRect(new Rect(0, 0, getWidth(), getHeight()));
//將圖片縮小到原來的1/12
mCanvas.translate(-getLeft() / scaleFactor, -getTop() / scaleFactor);
mCanvas.scale(1 / scaleFactor, 1 / scaleFactor);
//畫壁紙
mCanvas.drawBitmap(mWallpaperBitmap,0,0,drawPaint);
//畫屏幕
View mView=Launcher.getLauncher().getBlurView();
mView.draw(mCanvas);
mCanvas.restore();
long consumingTime = System.nanoTime() -startTime; //消耗時間
Bitmap lastBitmap=NativeStackBlur.process(mBlurBitmap, radius);
Log.d("blurLayout", "blur_bg:" + consumingTime/1000000);
setImageBitmap(lastBitmap);
return false;
}
//獲取壁紙我就不說了,根據壁紙類,拿壁紙的偏移量*WorkSpace的寬度,就可以裁剪出,當前屏幕的Bitmap。