毛玻璃效果简单实现
項目中需要運用到毛玻璃的效果。經過搜索查閱,踩了一些坑,找到了一條暫時可行的辦法。
其中,核心的控件是使用RenderScript這個類,這個類屬于jni類,在較低版本的Android系統中,是不具備它的相關方法的。所以我們只能使用support.v8里面的類。然而,support.v8并沒有默認地放在新建工程中,因此我們需要自己去添加。
第一步:將D:AndroidSdkuild-tools23.0.1enderscriptlibpackaged 目錄下的armeabi-v7a和x86文件夾置于工程的libs路徑中
第二步:在build.gradle中寫腳本編譯這兩個.so文件
task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
destinationDir file("$projectDir/libs")
baseName "Native_Libs2"
extension "jar"
from fileTree(dir: "libs", include: "**/*.so")
into "lib"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
第三步:Rebuild Project
第四步:添加剛剛編譯的jar包Native_Libs2
第五步:毛玻璃效果的方法
private void blur(Bitmap overlay, View view, int radius) {
RenderScript rs = RenderScript.create(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();
}
PS:這個方法中radius為圖片模糊的粒度。我們進入setRadius方法中,可以看到
public void setRadius(float radius) {
if(radius > 0.0F && radius <= 25.0F) {
this.setVar(0, radius);
} else {
throw new RSIllegalArgumentException("Radius out of range (0 < r <= 25).");
}
}
radius最大只能是25.0
我猜想,在設計這個方法時,開發人員也考慮到這個方法是一個時間復雜度比較高的方法,尤其在大圖片,需要較大模糊程度的情況下,會有很大的概率出現性能問題,甚至OOM。
那么,如果我們需要比25更模糊的情況,或是,有一張較大的圖片需要模糊化時,該怎么辦呢?
常用的方法,即是,將原來需要模糊化的圖片先縮小,再模糊化,最后再顯示。經過一輪縮小之后,系統會自動將一些象素點綜合成一個,經過模糊再放大,獲得的模糊程度將高于直接模糊化的程度。
Done!
總結
- 上一篇: 如何在Excel2010用函数计算成绩的
- 下一篇: 柯尔莫可洛夫-斯米洛夫检验(Kolmog