Android实现高斯模糊(也叫毛玻璃效果)
2015-04-09 22:23
375 查看
一、实现效果图及说明
二、实现步骤
1、在armeabi-v7a文件夹下添加两个库文件(librsjni.so,libRSSupport.so)以及在libs文件夹下添加一个架包renderscript-v8.jar。
下载地址:http://download.csdn.net/detail/lmz14/8579719
2、在菜单界面(这里是popuwindow菜单界面)加载时,通过预览对菜单底部当前Activity显示的View保存成Bitmap形式,然后将Bitmap进行高斯模糊,最后将高斯模糊后的图设置为菜单的背景(即lin_menu的背景),关键代码如下所示。
(1)菜单界面加载时,进行预览,这里对收藏图标(id=“im_collection_dynamic”)添加预览监听事件,代码如下所示。
im_collection_dynamic.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
im_collection_dynamic.getViewTreeObserver().removeOnPreDrawListener(this);
im_collection_dynamic.buildDrawingCache();
if(v_bkg!=null){
Bitmap image = convertViewToBitmap(v_bkg);
blur(image,lin_menu);
}
return true;
}
});
(2)将当前Activity显示的View保存成Bitmap形式,代码如下所示。
/**
* 将View保存成Bitmap
* @param view
* @return
*/
public Bitmap convertViewToBitmap(View view){
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
Bitmap.Config.ARGB_8888);
//利用bitmap生成画布
Canvas canvas = new Canvas(bitmap);
//把view中的内容绘制在画布上
view.draw(canvas);
return bitmap;
}
(3)将Bitmap进行高斯模糊后设置为菜单的背景(即lin_menu的背景),代码如下所示。
/**
* 高斯模糊
* @param bkg
* @param view
*/
private void blur(Bitmap bkg, View view) {
float radius = 25;
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(mContext);
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.setBackgroundDrawable(new BitmapDrawable(
mContext.getResources(), overlay));
rs.destroy();
}
(4)若Activity布局带有滚动条,则需要对滚动进行监听,实时跟新变量v_bkg(即更新整个Activity当前显示的界面画面),代码如下。
对滚动变化监听:
list_comment.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(spinnerMenuDialog != null){
spinnerMenuDialog.updateView(v_bkg);
}
}
});
注:View v_bkg = (RelativeLayout) findViewById(R.id.rala_main);//R.id.rala_main是Activity布局文件根布局id
更新变量v_bkg:
/**
* 监听scollView,更新当前的View
* @param vBkg
*/
public void updateView(View vBkg){
v_bkg = vBkg;
}
二、实现步骤
1、在armeabi-v7a文件夹下添加两个库文件(librsjni.so,libRSSupport.so)以及在libs文件夹下添加一个架包renderscript-v8.jar。
下载地址:http://download.csdn.net/detail/lmz14/8579719
2、在菜单界面(这里是popuwindow菜单界面)加载时,通过预览对菜单底部当前Activity显示的View保存成Bitmap形式,然后将Bitmap进行高斯模糊,最后将高斯模糊后的图设置为菜单的背景(即lin_menu的背景),关键代码如下所示。
(1)菜单界面加载时,进行预览,这里对收藏图标(id=“im_collection_dynamic”)添加预览监听事件,代码如下所示。
im_collection_dynamic.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
im_collection_dynamic.getViewTreeObserver().removeOnPreDrawListener(this);
im_collection_dynamic.buildDrawingCache();
if(v_bkg!=null){
Bitmap image = convertViewToBitmap(v_bkg);
blur(image,lin_menu);
}
return true;
}
});
(2)将当前Activity显示的View保存成Bitmap形式,代码如下所示。
/**
* 将View保存成Bitmap
* @param view
* @return
*/
public Bitmap convertViewToBitmap(View view){
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
Bitmap.Config.ARGB_8888);
//利用bitmap生成画布
Canvas canvas = new Canvas(bitmap);
//把view中的内容绘制在画布上
view.draw(canvas);
return bitmap;
}
(3)将Bitmap进行高斯模糊后设置为菜单的背景(即lin_menu的背景),代码如下所示。
/**
* 高斯模糊
* @param bkg
* @param view
*/
private void blur(Bitmap bkg, View view) {
float radius = 25;
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(mContext);
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.setBackgroundDrawable(new BitmapDrawable(
mContext.getResources(), overlay));
rs.destroy();
}
(4)若Activity布局带有滚动条,则需要对滚动进行监听,实时跟新变量v_bkg(即更新整个Activity当前显示的界面画面),代码如下。
对滚动变化监听:
list_comment.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(spinnerMenuDialog != null){
spinnerMenuDialog.updateView(v_bkg);
}
}
});
注:View v_bkg = (RelativeLayout) findViewById(R.id.rala_main);//R.id.rala_main是Activity布局文件根布局id
更新变量v_bkg:
/**
* 监听scollView,更新当前的View
* @param vBkg
*/
public void updateView(View vBkg){
v_bkg = vBkg;
}
相关文章推荐
- Android 实现快速高斯模糊(毛玻璃)效果算法
- android 实时高斯模糊 毛玻璃效果
- Android 毛玻璃效果的实现
- Android开发——高斯模糊效果的简单实现
- Android实现高斯模糊效果(已做成依赖库很方便)
- Android 实现高斯模糊效果及低版本兼容
- Android毛玻璃效果的实现(本文系转载一种快速毛玻璃虚化效果实现)
- Android毛玻璃效果简单实现
- Android开发——高斯模糊效果的简单实现
- Android 实现高斯模糊效果及低版本兼容
- Android也能流畅实现毛玻璃效果(高斯模糊)效果
- Android高斯模糊技术,实现毛玻璃效果
- Android 毛玻璃效果实现(Glide)
- Android实现动态高斯模糊效果示例代码
- Android高斯模糊效果实现方案及性能对比
- android 毛玻璃模糊效果背景实现
- Android毛玻璃效果实现
- Android 实现高斯模糊效果
- Android实现动态高斯模糊效果
- Android 实现高斯模糊效果及低版本兼容