因为项目上有需求,将客人态的背景设置成用户头像的毛玻璃的效果(这句话怎么这么绕口,还是直接看图片吧)背景就是用户的头像
以前没做过这种功能,所以上网查了一下,大牛们调研了很多种实现方法,因为需求比较简单,对性能的要求没有那么苛刻,所以下面我将用最简单的发来实现。思路是利用现有 Android 提供的方法,通过 RenderScript 调用底层接口实现高斯模糊计算.这种方法直接利用 Android 系统提供的机制,从代码实现上是最简单也相对高效的。
第一步
在项目的 build.gradle 下引入 RenderScript 如下
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() 方法进行高斯模糊的计算,怎么样是不是很简单。
下面是核心的模糊算法
/**
* 一个高斯模糊的算法
*
* @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 的大小来进行设置。
好了到这里,一个高斯模糊的背景就诞生了,demo我就不贴了,因为这个还是比较简单的,有什么问题,可以联系我。
原文地址:http://hedgehog.love/2016/02/27/Android-Gaussian-blur-simple-implementation/转载请注明出处!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。