【问题标题】:How to Blur A View如何模糊视图
【发布时间】:2017-01-01 17:10:00
【问题描述】:

我有不同颜色的视图。我需要模糊该视图的背景。例如,有一个线性布局,其中有一个显示一些应用程序的网格,这个线性布局(Gridview Container)有颜色(红色/绿色/黑色......等没有图像)。现在我需要模糊 LinearLayout 的背景。 这个形象是我必须实现的。

我正在通过 Android Render 脚本执行所有这些操作,因为我有许多片段并且每个片段都有彩色背景,所以我认为 Render 是最好的选择,否则它可能会在查看寻呼机滑动时卡住。

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    RelativeLayout mainLayout=(RelativeLayout)findViewById(R.id.activity_main);
    view=(View)findViewById(R.id.view);
    Bitmap blurredBitmap = blur( this,  getBitmapFromView(view) );

    view.setBackgroundDrawable( new BitmapDrawable( getResources(), blurredBitmap ) );
    mainLayout.setBackgroundResource(R.drawable.wallp);
}
public static Bitmap getBitmapFromView(View view) {
    view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
    view.draw(canvas);
    return bitmap;
}
private static final float BITMAP_SCALE = 0.4f;
private static final float BLUR_RADIUS = 7.5f;

public static Bitmap blur(Context context, 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(context);
    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;
}

现在的问题是,如果我在 LinearLayout 的背景中设置颜色,则会出现

的错误

原因:java.lang.IllegalArgumentException:宽度和高度必须> 0 我们可以模糊视图的背景有颜色但没有图像

这是我的看法...

【问题讨论】:

  • if I set color in the background of the LinearLayout then 不清楚:你想模糊... 一种颜色????很明显,您只能模糊图像。并且它们的大小必须大于 0(我什至会说大于 1*1 像素)。在我看来,“模糊”一种颜色就像你想对颜色 透明度 采取行动一样。这与 blur 效果有很大不同。简而言之:can we blur the background of a view have having color but not image? 没有
  • @Rotwang 谢谢,你说得对,但情况是,如果我将该颜色的透明度设置为低,那么我可以清楚地看到背景壁纸,这里我需要如果用户设置不透明颜色,那么肯定你是对的,但是如果用户在我上传的图片中设置了透明颜色,那么我需要在 Gridview 后面显示模糊效果(现在不在图片中)
  • 再次,不清楚。但如果我能让你好起来,你希望 GridView 容器是“半透明的”。并且 GridView 完全透明,就像现在一样。
  • @Rotwang stackoverflow.com/questions/31808955/… 这是很好的解释。我需要在视图后面进行模糊处理(线性布局),线性布局是纯色还是透明色。
  • 再次,这是关于模糊 图像。这就是模糊的意义所在。 “模糊”单一颜色根本没有意义。

标签: android


【解决方案1】:

这可以通过以下步骤实现

  1. 通过裁剪提取LinearLayout的背景图片 背景图片。
  2. 现在扩展 LinearLayout 类。

  3. 覆盖 OnDraw(Canvas mCanvas) 方法。

  4. 在您的自定义 LinearLayout 类 1 中创建两个方法。 DrawBitmap 2. DrawColor.

  5. 首先调用 DrawBitmap 函数,方法是给出您从中获得的偏移量 ViewPager 到背景图像,以便在使用滑动时图像移动 屏幕。

  6. 最后用你的透明度绘制颜色

我希望这能解决您的问题。

此示例代码

View Background Blur

【讨论】:

    【解决方案2】:

    在调用getBitmapFromView 方法时,您的视图可能还没有准备好。您可以尝试包装您的方法,例如:

    view.post(new Runnable() {
        public void run(){
            Bitmap blurred = blur(YourActivity.this, getBitmapFromView(view));
            view.setBackgroundDrawable(new BitmapDrawable(getResources(), blurred));
        }
    });
    

    你可以使用你的blur()方法

    public static Bitmap blur(Context context, 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(context);
        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;
    }
    

    希望对您有所帮助!

    【讨论】:

    • blur() 是从哪里来的?
    • @c-an 您可以使用问题中提供的相同blur() 方法。
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 2021-05-23
    • 2022-12-14
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多