我试图使一个视图,将有一个背景,不仅是透明的,但也将有一个模糊的影响。这样下面的视图看起来就失焦了。我希望它看起来像屏幕后按下电源按钮。有什么想法吗?
如果你想做的只是模糊活动后面窗口的背景,那么你可以在活动中使用这个调用(或者任何类,比如有窗口的 AlertDialog)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
更新: 此标志在 Android 4.0中已被弃用,不再支持 。
既然窗口标志已经被废弃了,那么您必须模糊自己。我在其他地方回答过这个问题,但以下是模糊视野的方法:
您现在可以从渲染脚本库中使用 脚本内在模糊来快速模糊。给你是如何访问渲染脚本 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:
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)); } }); }
注意: 此解决方案要求 min sdk 为 < strong > API 17
编辑: Renderscript 被包含在支持 v8中,使得这个问题的答案可以降低到 api 8。要使用 格莱德启用它,请将这些行包含到您的 gradle 文件中(来自这个 回答) ,并使用来自包 Android.support. v8.renderscript的 Renderscript:
android { ... defaultConfig { ... renderscriptTargetApi *your target api* renderscriptSupportModeEnabled true } ... }
模糊是一个不错的选择,很容易给你的效果,你正在寻找: Https://github.com/wasabeef/blurry
将其添加到项目后,将想要模糊的视图包装到 FrameLayout 中,然后在想要模糊时使用以下代码行:
Blurry.with(this).radius(25).sampling(2).onto((ViewGroup) findViewById(R.id.viewToBlurWrapper));