由於項目上有需求,將客人態的背景設置成用戶頭像的毛玻璃的效果(這句話怎麼這麼繞口,仍是直接看圖片吧)背景就是用戶的頭像算法
之前沒作過這種功能,因此上網查了一下,大牛們調研了不少種實現方法,由於需求比較簡單,對性能的要求沒有那麼苛刻,因此下面我將用最簡單的發來實現。思路是利用現有 Android 提供的方法,經過 RenderScript 調用底層接口實現高斯模糊計算.這種方法直接利用 Android 系統提供的機制,從代碼實現上是最簡單也相對高效的。canvas
第一步app
在項目的 build.gradle 下引入 RenderScript 以下ide
defaultConfig { applicationId "com.xxxx.xxxx" minSdkVersion 17 targetSdkVersion 22 // 如下是高斯模糊相關的API renderscriptTargetApi 22 renderscriptSupportModeEnabled true }
經測試若是想以這種方式實現高斯模糊的效果,那麼 minSdkVersion 最低爲 17 ,否則運行的時候會報錯。佈局
第二步性能
給須要進行高斯模糊的背景Imageview設置圖片資源,不明白?其實模糊的那一坨東西就是個Imageview,從接口拉取到的用戶的頭像,再將頭像設置給Imageview 設置好以後就能夠用下面的方法添加模糊效果了。測試
/** * 添加模糊效果 */ private void applyBlur() { imgBackgroung.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { imgBackgroung.getViewTreeObserver().removeOnPreDrawListener(this); imgBackgroung.buildDrawingCache(); Bitmap bmp = imgBackgroung.getDrawingCache(); blur(bmp, textBlur); return true; } }); }
imgBackgroung 是 佈局的背景Imageview 能夠在進入 Activity 的時候拉去用戶頭像,而後將背景的Imageview設置成用戶的頭像,以後執行 applyBlur() 方法進行高斯模糊的計算,怎麼樣是否是很簡單。gradle
下面是核心的模糊算法ui
/** * 一個高斯模糊的算法 * * @param bkg * @param view */ private void blur(Bitmap bkg, View view) { float radius = 20; Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()), (int) (view.getMeasuredHeight()), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(overlay); canvas.translate(-view.getLeft(), -view.getTop()); canvas.drawBitmap(bkg, 0, 0, null); RenderScript rs = RenderScript.create(UserInfoActivity.this); Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay); ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement()); blur.setInput(overlayAlloc); blur.setRadius(radius); blur.forEach(overlayAlloc); overlayAlloc.copyTo(overlay); view.setBackground(new BitmapDrawable(getResources(), overlay)); rs.destroy(); }
模糊的程度能夠經過改變 radius 的大小來進行設置。this
好了到這裏,一個高斯模糊的背景就誕生了,demo我就不貼了,由於這個仍是比較簡單的,有什麼問題,能夠聯繫我。
原文地址:http://hedgehog.love/2016/02/27/Android-Gaussian-blur-simple-implementation/轉載請註明出處!