Android模糊影象教程(2)

fhdis發表於2014-04-24

前面我們介紹了使用RenderScript使另一個檢視範圍內的圖片部分模糊。但是實際上,我們並沒有深入地呼叫這個方法來研究影象模糊行為。原因是我們需要在效能方面進行仔細考慮,這篇文章我們會進行更進一步地的探索。

呼叫這個方法最直白的方法是父佈局的onDraw()。有經驗的開發者讀到這裡可能會開始搖頭,我們應該保持onDraw方法的實現儘可能有效。以前的文章中的程式碼包括建立物件、點陣圖操作和切換到renderScript上下文。其中,OnDraw會降低幀速率。你可以不相信我的做法,但是可以通過測量並證明它是有效的。在後面的系列中,我們就會這樣做。

如果佈局是靜態的(即我們的佈局不包含任何動畫),在佈局時就不會改變待模糊的位置和範圍。只有在佈局改變時執行該操作才有意義,但前提是佈局的所有檢視大小和位置根據佈局變化測量和計算過。這裡有一個非常實用的技巧,可以註冊一個OnGlobalLayoutListener監聽函式。當佈局發生改變的時候會呼叫onGlobalLayout()方法。當我們收到佈局已經改變的通知時,註冊的OnPreDrawListener監聽函式的onPreDraw()方法會被呼叫每當執行onDraw方法。我們要做的第一件事情就是取消註冊onPreDraw()方法,這樣只有在佈局改變的時候才會被呼叫,而不是每次onDraw方法觸發時都呼叫。下面可以執行模糊方法,從這個方法的返回值很重要,使用它可以讓我們放棄onDraw操作,重複之前的佈局。這對在回撥函式中修改佈局非常有幫助,但是這裡不需要這麼做。所以返回true,繼續繪製。

我們的Activity程式碼如下:

在父佈局覆蓋onDraw方法的優點是,可以在佈局層次上任意附加OnPreDrawListener方法。因此需要自定義一個佈局,這個佈局是標準佈局的子類,這樣就可以覆蓋onDraw方法。使用predrawlistener意味著可以非常容易在任意佈局中新增。

最後,模糊圖片實現如下:

part1

在下一篇文章中,我會更深入地回答為什麼要避免在onDraw中執行模糊操作,並且還會介紹有用的效能測量工具。

這篇文章的程式碼在這裡

相關文章