创build模糊的透明背景效果

我想提出一个不仅透明的背景,而且还会产生模糊的效果。 这样下面的观点似乎就没有了焦点。 我想让它看起来像按住电源button后的屏幕。 有任何想法吗?

现在,窗口标志已被弃用,你必须模糊自己。 我在别的地方回答了这个问题,但这里是你如何模糊一个观点:

您现在可以使用RenderScript库中的ScriptIntrinsicBlur快速模糊。 以下是如何访问RenderScript API。 以下是我为模糊视图和位图所做的一个类:

import android.support.v8.renderscript.*; public class BlurBuilder { private static final float BITMAP_SCALE = 0.4f; private static final float BLUR_RADIUS = 7.5f; public static Bitmap blur(View v) { return blur(v.getContext(), getScreenshot(v)); } public static Bitmap blur(Context ctx, Bitmap image) { int width = Math.round(image.getWidth() * BITMAP_SCALE); int height = Math.round(image.getHeight() * BITMAP_SCALE); Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false); Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); RenderScript rs = RenderScript.create(ctx); ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap); Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap); theIntrinsic.setRadius(BLUR_RADIUS); theIntrinsic.setInput(tmpIn); theIntrinsic.forEach(tmpOut); tmpOut.copyTo(outputBitmap); return outputBitmap; } private static Bitmap getScreenshot(View v) { Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.draw(c); return b; } } 

要将其应用于片段,请将以下内容添加到onCreateView

 final Activity activity = getActivity(); final View content = activity.findViewById(android.R.id.content).getRootView(); if (content.getWidth() > 0) { Bitmap image = BlurBuilder.blur(content); window.setBackgroundDrawable(new BitmapDrawable(activity.getResources(), image)); } else { content.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Bitmap image = BlurBuilder.blur(content); window.setBackgroundDrawable(new BitmapDrawable(activity.getResources(), image)); } }); } 

注意:此解决scheme需要min sdk为API 17

编辑: Renderscript包括在支持v8启用这个答案到api 8.使用gradle启用它包括到您的gradle文件(从这个答案 )这些行,并使用包android.support.v8.renderscript的 Renderscript:

 android { ... defaultConfig { ... renderscriptTargetApi *your target api* renderscriptSupportModeEnabled true } ... } 

如果你所要做的只是模糊活动背后的窗口背景,那么你可以在你的活动中使用这个调用(或者任何类,比如有一个窗口的AlertDialog)

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 

更新:这个标志已被弃用在Android 4.0,不再有效

模糊是一个很好的select,这将很容易地给你你正在寻找的效果: https : //github.com/wasabeef/Blurry

在将其添加到项目中之后,将想要模糊的视图封装到FrameLayout中,然后在想要模糊时使用以下代码行:

 Blurry.with(this).radius(25).sampling(2).onto((ViewGroup) findViewById(R.id.viewToBlurWrapper));