1. 程式人生 > >Android毛玻璃(磨砂)效果(靜態&動態背景圖模糊 收集)

Android毛玻璃(磨砂)效果(靜態&動態背景圖模糊 收集)

果然前人栽樹,後人乘涼.

google搜尋”Android實現動態高斯模糊效果”發現2016年轉載的部落格居多(或者試試英文搜尋,可能時間會提前很多.),看來2016年想實現這種效果的產品多; 2014年是圖片高斯模糊2015年有效能對比2016年火的就是動態高斯模糊了,不知道對於效能的影響有多大,消耗記憶體佔用資源得有個資料show一下,當然在比較效能之前,應該先實現效果.

待都嘗試執行過後再弄資料.

Android實現動態高斯模糊效果 2016-8-5 指令碼之家 轉載.
這篇使用的是support v8庫的RenderScript進行高斯模糊,文中提到的動態高斯模糊改變的不是高斯模糊的radius引數,而是通過FrameLayout ,在下層放一個模糊過的圖片,上面該一層原圖,通過seekbar動態調整上層原圖的alpha值,待上層完全透明後,就露出了下層的模糊過的圖片,使用者感受的效果是逐漸模糊,實際上是重疊效果,具體看原文.

高斯模糊關鍵程式碼:

private Bitmap blur(Bitmap bitmap, float radius) {
    Bitmap output = Bitmap.createBitmap(bitmap);
    RenderScript rs = RenderScript.create(getActivity());// 構建一個RenderScript物件
    ScriptIntrinsicBlur gaussianBlur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); // 建立高斯模糊指令碼
    Allocation allIn = Allocation.createFromBitmap(rs, bitmap);//建立用於輸入的指令碼型別
    Allocation allOut = Allocation.createFromBitmap(rs, output); // 建立用於輸出的指令碼型別
    gaussianBlur.setRadius(radius); // 設定模糊半徑,範圍0f<radius<=25f
    gaussianBlur.setInput(allIn); // 設定輸入指令碼型別
    gaussianBlur.forEach(allOut); // 執行高斯模糊演算法,並將結果填入輸出指令碼型別中
    allOut.copyTo(output); // 將輸出記憶體編碼為Bitmap,圖片大小必須注意
    rs.destroy(); // 關閉RenderScript物件,API>=23則使用rs.releaseAllContexts()
    return output;
}
public Bitmap blurBitmap(Bitmap bitmap){

    //Let's create an empty bitmap with the same size of the bitmap we want to blur
    Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
    //Instantiate a new Renderscript
    RenderScript rs = RenderScript.create(getApplicationContext());
    //Create an Intrinsic Blur Script using the Renderscript
    ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
    //Create the Allocations (in/out) with the Renderscript and the in/out bitmaps
    Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
    Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
    //Set the radius of the blur
    blurScript.setRadius(25.f);
    //Perform the Renderscript
    blurScript.setInput(allIn);
    blurScript.forEach(allOut);
    //Copy the final bitmap created by the out Allocation to the outBitmap
    allOut.copyTo(outBitmap);
    //recycle the original bitmap
    bitmap.recycle();
    //After finishing everything, we destroy the Renderscript.
    rs.destroy();
    return outBitmap;
}

使用RenderScript是有條件的,
* Android SDK Tools 版本必須大於等於22.2
* Android SDK Build-tools 版本必須大於等於18.1.0
這種方法的優勢是:
RenderScript這個工具會充分發揮裝置的計算能力(CPU和GPU)來進行計算,並且是使用C99衍生語言進行指令碼編寫的,
* 對於高質量圖片或變化較多的需求相較於Java效能是大大的提升。
* 高斯模糊實現 -> 動態高斯模糊實現.

Android 實現毛玻璃效果 來自某個個人部落格 blog.hwangjr.com,2015-07-10

利用V 8包提供Render介面實現 部分內容同文獻一,並指出文獻一方法的弊端:
這種方法直接利用Android系統提供的機制,從程式碼實現上是最簡單也相對高效的實現。在此過程中遇到的很現實的問題是,直接使用ScriptIntrinsicBlur不能得到模糊程度較高的圖片

(1)當模糊半徑 (radius)變大後會直接出現計算效能問題。
(2)ScriptIntrinsicBlur指令碼模糊半徑不能大於25。

考慮到高斯模糊是計算周邊畫素平均值,在模糊程度很高的情況下,逐點計算平均值從顯示效果上優勢並不明顯。可以通過將圖片壓縮成小圖,計算小圖的高斯模糊,再將小圖放大的方法來模擬大半徑高斯模糊的效果。這裡的FastBlur正是很多專案中實際使用的。FastBlur在2014年及更前就已出現。

這種方式通過在Java層中直接實現高斯模糊演算法。在大模糊半徑和大圖片情況下,效能會出現問題。基本目前只作為對低版本Android客戶端的相容性方案使用。

第二個方式通過直接計算高斯並直接在檢視畫布上實現BlurLinearLayout,用了全域性監聽不斷去擷取螢幕截圖,再十分之一倍率縮小。
這種方式模糊的是layout本身,不是裡面包含的imageview.

OpenGL實現(消耗效能,不推薦)

“ 無論從效果和實時性來講都是最好的,但需要根據需求來看是否真的有這樣的實時性要求。這種方式從顯示效果上會優於第一種方法,甚至可以達到漸變的效果,但這些計算都是以耗電作為代價的。作為Launcher這種系統級別的應用,在顯示效果差異並不明顯的情況下,建議綜合考慮耗電量,以及記憶體和計算效能的消耗。 ”

擷取些真心不錯的回答:

這個問題要分兩部分來看。
第一是模糊演算法,主要目前有兩種方案:
(1)藉助Renderscript做高斯模糊,這個本質上是做了個卷積計算。
(2)用jni實現StackBlur 演算法對圖片進行模糊處理,這個可以看下原始碼,相較於高斯模糊,計算量小了很多。
兩種方案都可以進行對Bitmap物件的模糊處理,但當模糊半徑增大時,StackBlur能夠保持較好的效能,且不受Renderscript半徑25px的限制。這兩種方案都可以通過對原圖進行壓縮取樣方式優化。至於模糊結果,可以看實際效果,個人認為均可滿足需求。
第二是使用場景,同樣分為兩種:
(1)非實時處理:比如說用做背景虛化,這種場合下對效能要求不是太苛刻,只要保證在非主執行緒處理好圖片,之後填充即可。上面兩種方案都可滿足需求。
下面是stackblur的一個android實現
kikoso/android-stackblur · GitHub
(2)實時處理:比如說需要在滾動的ListView或者ScrollView上新增毛玻璃遮罩。由於待虛化的Bitmap不是固定不變的,這就需要我們逐幀處理。這個時候半徑如果大的話,Renderscript會出現明顯的卡頓,而StackBlur方案在中高階機器上會有不錯的表現。
下面是一個比較好的開源的android實現,使用起來比較簡單
harism/android_anndblur · GitHub
其原理是自定義容器控制元件,通過重繪的方式獲取自身原本要繪製的bitmap紋理,然後實時處理並填充到自身的背景中,能保證基本的流暢度。注意會除了模糊處理,還會引發多餘的繪製操作。鐵定會拖慢UI的流暢度。
對於實時毛玻璃效果,建議還是多做測試,畢竟耗費計算資源,甚至可以監控fps設定閾值對特效進行開關。

2016-8 回答
zhihu問答截圖

參考連結:

相關推薦

Android毛玻璃效果(靜態動態背景模糊 收集)

果然前人栽樹,後人乘涼. google搜尋”Android實現動態高斯模糊效果”發現2016年轉載的部落格居多(或者試試英文搜尋,可能時間會提前很多.),看來2016年想實現這種效果的產品多; 2014年是圖片高斯模糊2015年有效能對比2016年火的就是動態

wpf 實現實時毛玻璃live blur效果

() 參數 顯示 top cli gif etc har led 原文:wpf 實現實時毛玻璃(live blur)效果 I2OS7發布後,就被它的時實模糊吸引了,就想著能不能

iOS半透明效果實現

// 判斷系統版本是否支援 8.0 UIView *blurEffectView; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { // 磨砂效果 UIBlurEffe

Android 上下滾動跑馬燈效果實現

產品的有個需求是 文字上下滾動,第一想到的是用屬性動畫實現,2個TextView 切換滾動,網上看了一堆資料大部分都是 TextSwitch,寫部落格不貼效果圖真的是很惆悵,不知道具體效果如何,第一次進入切換是否有問題,還有就是最後一個切換到第二個是否有問題,動畫是否流暢等,

Android 文字自動滾動跑馬燈效果的兩種實現方法[特別好使]

    public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);         initView();     }      

Android 文字自動滾動跑馬燈效果的兩種實現方法

    public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);         initView();     }      

【java項目實戰】代理模式Proxy Pattern靜態代理 VS 動態代理

自己 text 好的 trace use 代理 分類 plproxy this 這篇博文,我們主要以類圖和代碼的形式來對照學習一下靜態代理和動態代理。重點解析各自的優缺點。 定義 代理模式(Proxy Pattern)是對象的結構型模式,代理模

Cocos2d-x使用過程中遇到的錯誤(VS下開發,移植到Android釋出)更新ing

環境:windows7, VS2010, cocos2d-1.0.1-x-0.12.0, cygwin, eclipse, android sdk4.0.3, ndk r7b 在vs上開發,然後移植到android上. 20120718 CCArray的foreach操作: c

CSDN學院中的Android影音流媒體播放器開發實戰基於NDK、C++和FFmpeg 課程已經上線

CSDN學院中的 FFmpeg安卓流媒體播放器開發實戰視訊課程已經上線 課程開發工具:      AndroidStudio3   Android影音(流媒體)播放器開發實戰基於NDK、C++和FFmpeg   對學員

虛擬機器unbutun16.04設定靜態ip

電腦上裝了虛擬機器,想用xshell連線,無奈按照預設的網路設定方式每次重啟了虛擬機器後都要修改ip才能訪問,這怎麼能忍,經過一番折騰終於搞定這個問題了,解決步驟如下:   大步驟分為兩步:其一是主機的設定,其二是虛擬機器的設定 首先說比較麻煩的虛擬機器的設定,可以從外面到裡面來進行,先進行V

Android學習十一—— Android介面卡

Android介面卡 安卓的介面卡在我看來是一個非常重要的知識點,面對形式相同但資料來源較多的情況時,介面卡是一個比較好的解決方法。資料介面卡是建立了資料來源與控制元件之間的適配關係,將資料來源轉換為控制元件能夠顯示的資料格式,從而將資料的來源與資料的顯示進行解耦,降低程式的耦合性。這篇文章就說一下如何實現

Android圖譜個人記錄

最近想搞一個圖譜app出來,主要記錄各個知識點,流行的框架的使用,這篇文章也是為了以做筆記形式寫的 暫時打算分為下面幾個部分: 四大元件 UI Net DynamicLoad Cache Database Framework JNI AIDL

Android-Toast吐司的基本用法

吐司(Toast) Android用於提示資訊的一個控制元件——Toast(吐司)! Toast是一個包含小資訊的提示框。會自動消失。(並不干擾使用者操作) Toast繼承樹 java.lang.object 派生出 android.widget.Toast 建立T

耳朵十二——linux靜態IP設定

linux設定靜態ip: linux系統的ip的設定與網絡卡有關linux系統的網絡卡在/etc/sysconfig/network-script/目錄下。 以本機為例網絡卡資訊就放在這個目錄下的ifcfg.ens33檔案裡 [[email prote

微信小程式學習筆記----實現簡單的文章列表圖文列表效果

寫這個之前我在網上搜了一下,想要先找一個合適的樣例對著寫一下,這樣還簡單一些,但是找了找沒有找到我心裡面比較合適的,所以乾脆就直接自己寫一下,沒有做什麼過多的修飾,實現起來還是很簡單的。 首先來上一下效果圖: 基本就是這樣的簡單的圖文效果,程式碼也非常簡單,如果有標題

完整學習筆記之Android基礎詳版

Android專案的目錄結構(熟悉) Activity:應用被開啟時顯示的介面 src:專案程式碼 R.java:專案中所有資原始檔的資源id Android.jar:Android的jar包,匯入此包方可使用Android的api libs:匯入第三方ja

Android CTS相容性測試整個流程

為了保證開發的應用在所有相容Android的裝置上正常執行,並保證一致的使用者體驗,Google制定了CTS(Compatibility Test Suite)來確保裝置執行的Android系統全面相容Android規範,Google也提供了一份相容性標準文件(Compat

android開發效能篇

今天想說的重點是Android APP效能優化,也就是在開發應用程式時應該注意的點有哪些,如何更好地提高使用者體驗。一個好的應用,除了要有吸引人的功能和互動之外,在效能上也應該有高的要求,即時應用非常具有特色,在產品前期可能吸引了部分使用者,但是使用者體驗不好的話,也會給產品帶來不好的口碑。那麼一

Android enum列舉型別使用詳解

原始的介面定義常量: public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu";

關於大型網站技術演進的思考十四--網站靜態化處理—前後端分離—上6

  前文講到了CSI技術,這就說明網站靜態化技術的講述已經推進到了瀏覽器端了即真正到了web前端的範疇了,而時下web前端技術的前沿之一就是前後端分離技術了,那麼在這裡網站靜態化技術和前後端分離技術產生了交集,所以今天我將討論下前後端分離技術,前後端分離技術討論完後,下一篇文章我將會以網站靜態化技術的角度回過