【问题标题】:Android blurring dynamic / scrolling contentAndroid模糊动态/滚动内容
【发布时间】:2016-02-02 09:08:51
【问题描述】:

我需要帮助实施模糊解决方案才能完成以下任务:

  1. 我有一个与整个活动匹配的 ScrollView,具有动态内容:可以添加、动画、删除等内容;
  2. 我有一个标题隐藏内容被滚动到屏幕顶部时

那个header实际上是应该模糊通过的内容然后从屏幕上消失的那个。

我尝试使用许多库,例如Stackblurpaveldudka's blurring,最后是500px own library

其中一些失败了(没有模糊,或者不是预期的结果),我仍在试图找出原因...... 他们都使用相同的技术Android RenderScript Library

主要问题是这些库提供了一次性渲染。意思是,他们的模糊一次,就是这样。它非常适合固定背景/内容。

500px 库最接近我正在寻找的内容:

  1. 他们的演示展示了一个带有动画图像的屏幕,中间有一个模糊的正方形;
  2. 如果所述图像通过所述模糊方块下方,它们会动态地变得模糊

查看代码,模糊是在动画侦听器的 update 方法 中重新渲染的。这是非常昂贵的,我想知道这是否可行。

【问题讨论】:

  • 在像滚动这样的动画期间,可能没有足够有效的方法来动态模糊 ui。当我说“高效”时,我的意思是性能方面。不管怎样,试试这个库:github.com/wasabeef/Blurry
  • 谢谢,但看起来这个库是一个易于使用的模糊图像解决方案。再一次,非常适合固定内容。无法在 ScrollView 中使用它。正如你所说,我相信他们没有这样的方式来完成我正在寻找的东西。我需要将 bitmapdrawable 从一个与标题大小相同的矩形中绘制出来,以捕获标题下方的内容,将其模糊并将其设置为标题背景。在我的情况下,每次用户滚动时我都必须这样做......
  • 另一种选择是模仿模糊图像的感觉,即带有半透明层的东西。如果您必须模糊的视图在颜色方面看起来非常相似,您可以生成一个模糊图像并使用该图像的半透明层。
  • @gilgil28 我同意你的选择。我也在想同样的事情。渐变色透明的东西。问题是滚动内容可能非常多样化,因此渲染效果不会很令人满意。但这仍然是一个可行的选择。感谢您的意见:) 不过很奇怪的是,在 iOS 上很容易做到这一点:/
  • 也许值得检查一下这是如何在 iOS 中实现的。这一定是某种解决方法,可能比我建议的更复杂

标签: java android blur renderscript


【解决方案1】:

如果您没有找到任何足够的解决方案,我将添加我如何模糊整个屏幕,这应该是使用 RS 最快最有效的方法:

private static final float BITMAP_SCALE = 0.05f;
private static final float BLUR_RADIUS = 8.0f;

    private Bitmap blurImage (Bitmap input) {
        if (input == null){
            return null;
        }

        int width = Math.round(input.getWidth() * BITMAP_SCALE);
        int height = Math.round(input.getHeight() * BITMAP_SCALE);

        Bitmap inputBitmap = Bitmap.createScaledBitmap(input, width, height, false);
        Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);

        ScriptIntrinsicBlur theIntrinsic = null;

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

【讨论】:

  • 感谢您的大力投入,但不幸的是,我已经多次尝试过非常相似的技术。您的解决方案是模糊任何内容的正确方法,但不是像我试图做的那样即时。还是谢谢!
猜你喜欢
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多