桌面的模糊,比较蛋疼。效率一直是一个问题,因为桌面要合成壁纸+桌面+模糊。
我的做法如下:
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。