一、实现效果图及说明




二、实现步骤

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. 常见android中的style
  2. !!!Android开发、测试持续集成环境Jenkins搭建
  3. 安桌HttpURLConnection错误解决
  4. Android中万能的BaseAdapter(Spinner,ListView,GridView)的使用!
  5. Android(安卓)JNI 高级篇
  6. Android实践 -- 监听外置sdcard(TF卡)的插拔事件
  7. 【Android(安卓)SDK 开发】安卓开发常用工具和第三方库汇总
  8. android使用AIDL跨进程通信(IPC)
  9. 关于Android(安卓)Studio无法查看详细的源代码问题解决

随机推荐

  1. 手机app图标显示为机器人或者不显示的解
  2. 【Android(安卓)Linux内存及性能优化】(
  3. Android(安卓)开发日常笔记,持续更新中
  4. IOS之UITabBarViewController用法
  5. 【阿里聚安全·安全周刊】一种秘密窃取数
  6. Android下实现一个Activity的全屏显示
  7. 4412开发板Android教程——Android平台简
  8. 关于build.gradle配置文件详细参数讲解
  9. 图解IntelliJ IDEA 13版本对Android(安卓
  10. Android(安卓)wifi信号强度与图标对应关