【问题标题】:Create blurry transparent background effect创建模糊透明背景效果
【发布时间】:2011-07-22 20:04:31
【问题描述】:

我正在尝试制作一个不仅具有透明背景,而且还具有模糊效果的视图。这样,下面的视图似乎就失焦了。我希望它看起来像按住电源按钮后的屏幕。有什么想法吗?

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    现在窗口标志已被弃用,您必须模糊自己。我在其他地方回答了这个问题,但这里是如何模糊视图:

    您现在可以使用 RenderScript 库中的 ScriptIntrinsicBlur 快速模糊。 Here 是如何访问 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));
            }
        });
    }
    

    注意:此解决方案要求 min sdk 为 API 17

    编辑: Renderscript 包含在支持 v8 中,使这个答案可以一直到 api 8。要使用 gradle 启用它,请将这些行包含到您的 gradle 文件中(来自 @987654323 @) 并使用包 android.support.v8.renderscript 中的 Renderscript:

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

    【讨论】:

    • 你摇滚。这严重帮助了我。我添加的一件事是从模糊函数返回的位图是一个 TransitionDrawable。这有助于使模糊效果看起来更平滑。
    • 想评论一下 BITMAP_SCALE 和 BLUR_RADIUS 常量是如何工作的?谢谢
    • 这对我不起作用。背景完全没有模糊
    • 对于那些说它不起作用的人......您是否尝试使用您在 onCreateView() 中膨胀的视图作为背景的目标,而不是使用“窗口”(活动。获取窗口())??这对我有用
    • 在activity中如何使用?
    【解决方案2】:

    如果您只想模糊 Activity 后面的窗口背景,那么您可以在 Activity(或任何类,如具有窗口的 AlertDialog)中使用此调用

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

    更新:此标志在 Android 4.0 中已弃用,不再有效

    【讨论】:

    • 正是我想要的。我很感激!
    • 不再支持。
    • 正如其他人所说,不再支持此功能,此帖子已有 4 年历史,因此请关注 B. Young 的帖子。
    • @Idistic,但如果您关注 B. Young 的帖子,您必须将最低 SDK 级别提高到 17:-/
    【解决方案3】:

    模糊是一个不错的选择,它可以轻松地为您提供您正在寻找的效果: https://github.com/wasabeef/Blurry

    将它添加到项目后,将要模糊的视图包装在 FrameLayout 中,然后在要模糊时使用此行:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2015-03-18
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多