创建模糊的透明背景效果

我试图使一个视图,将有一个背景,不仅是透明的,但也将有一个模糊的影响。这样下面的视图看起来就失焦了。我希望它看起来像屏幕后按下电源按钮。有什么想法吗?

95113 次浏览

如果你想做的只是模糊活动后面窗口的背景,那么你可以在活动中使用这个调用(或者任何类,比如有窗口的 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:

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));