首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模糊视野

如何模糊视野
EN

Stack Overflow用户
提问于 2017-01-01 17:10:00
回答 2查看 4.4K关注 0票数 4

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

我所有这些都是由Android渲染脚本完成的,因为我有很多片段,每个片段都有颜色背景,所以我认为渲染是最好的选择,否则它可能会在浏览页刷时被卡住。

代码语言:javascript
复制
 @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,我们可以模糊一个视图的背景有颜色而不是图像

这是我的看法..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-02 10:53:16

这可以通过以下步骤实现

  1. 通过裁剪背景图像提取LinearLayout的背景图像。
  2. 现在扩展LinearLayout类。
  3. 重写OnDraw(画布mCanvas)方法。
  4. 在自定义LinearLayout类1. DrawBitmap 2. DrawColor中创建两个方法。
  5. 首先调用DrawBitmap函数,给出从ViewPager到背景图像的偏移量,这样当使用时,图像就会移动。
  6. 最后用你的透明度绘制颜色。

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

示例代码用于此

查看背景模糊

票数 2
EN

Stack Overflow用户

发布于 2017-04-25 13:46:27

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

代码语言:javascript
复制
view.post(new Runnable() {
    public void run(){
        Bitmap blurred = blur(YourActivity.this, getBitmapFromView(view));
        view.setBackgroundDrawable(new BitmapDrawable(getResources(), blurred));
    }
});

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

代码语言:javascript
复制
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;
}

希望能帮上忙!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41417300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档