Andorid 實現 Launcher桌面快速模糊 13毫秒左右

桌面的模糊,比較蛋疼。效率一直是一個問題,因爲桌面要合成壁紙+桌面+模糊。

我的做法如下:

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章