我想在 ImageView中添加模糊动画,但设置持续时间.所以,例如,我希望图像随着时间的推移而模糊.

我已经有了模糊图像的方法,但我需要的是让它从模糊变为无模糊,比如2秒.

有人可以帮帮我吗?

编辑:这是我目前模糊图像的方法.

public Bitmap blur(Bitmap sentBitmap,int radius) {

    // Stack Blur Algorithm by Mario Klingemann <mario@quasimondo.com>

    Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(),true);

    if (radius < 1) {
        return (null);
    }

    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    int[] pix = new int[w * h];
    Log.e("pix",w + " " + h + " " + pix.length);
    bitmap.getPixels(pix,w,h);

    int wm = w - 1;
    int hm = h - 1;
    int wh = w * h;
    int div = radius + radius + 1;

    int r[] = new int[wh];
    int g[] = new int[wh];
    int b[] = new int[wh];
    int rsum,gsum,bsum,x,y,i,p,yp,yi,yw;
    int vmin[] = new int[Math.max(w,h)];

    int divsum = (div + 1) >> 1;
    divsum *= divsum;
    int dv[] = new int[256 * divsum];
    for (i = 0; i < 256 * divsum; i++) {
        dv[i] = (i / divsum);
    }

    yw = yi = 0;

    int[][] stack = new int[div][3];
    int stackpointer;
    int stackstart;
    int[] sir;
    int rbs;
    int r1 = radius + 1;
    int routsum,goutsum,boutsum;
    int rinsum,ginsum,binsum;

    for (y = 0; y < h; y++) {
        rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
        for (i = -radius; i <= radius; i++) {
            p = pix[yi + Math.min(wm,Math.max(i,0))];
            sir = stack[i + radius];
            sir[0] = (p & 0xff0000) >> 16;
            sir[1] = (p & 0x00ff00) >> 8;
            sir[2] = (p & 0x0000ff);
            rbs = r1 - Math.abs(i);
            rsum += sir[0] * rbs;
            gsum += sir[1] * rbs;
            bsum += sir[2] * rbs;
            if (i > 0) {
                rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];
            } else {
                routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];
            }
        }
        stackpointer = radius;

        for (x = 0; x < w; x++) {

            r[yi] = dv[rsum];
            g[yi] = dv[gsum];
            b[yi] = dv[bsum];

            rsum -= routsum;
            gsum -= goutsum;
            bsum -= boutsum;

            stackstart = stackpointer - radius + div;
            sir = stack[stackstart % div];

            routsum -= sir[0];
            goutsum -= sir[1];
            boutsum -= sir[2];

            if (y == 0) {
                vmin[x] = Math.min(x + radius + 1,wm);
            }
            p = pix[yw + vmin[x]];

            sir[0] = (p & 0xff0000) >> 16;
            sir[1] = (p & 0x00ff00) >> 8;
            sir[2] = (p & 0x0000ff);

            rinsum += sir[0];
            ginsum += sir[1];
            binsum += sir[2];

            rsum += rinsum;
            gsum += ginsum;
            bsum += binsum;

            stackpointer = (stackpointer + 1) % div;
            sir = stack[(stackpointer) % div];

            routsum += sir[0];
            goutsum += sir[1];
            boutsum += sir[2];

            rinsum -= sir[0];
            ginsum -= sir[1];
            binsum -= sir[2];

            yi++;
        }
        yw += w;
    }
    for (x = 0; x < w; x++) {
        rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
        yp = -radius * w;
        for (i = -radius; i <= radius; i++) {
            yi = Math.max(0,yp) + x;

            sir = stack[i + radius];

            sir[0] = r[yi];
            sir[1] = g[yi];
            sir[2] = b[yi];

            rbs = r1 - Math.abs(i);

            rsum += r[yi] * rbs;
            gsum += g[yi] * rbs;
            bsum += b[yi] * rbs;

            if (i > 0) {
                rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];
            } else {
                routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];
            }

            if (i < hm) {
                yp += w;
            }
        }
        yi = x;
        stackpointer = radius;
        for (y = 0; y < h; y++) {
            // Preserve alpha channel: ( 0xff000000 & pix[yi] )
            pix[yi] = ( 0xff000000 & pix[yi] ) | ( dv[rsum] << 16 ) | ( dv[gsum] << 8 ) | dv[bsum];

            rsum -= routsum;
            gsum -= goutsum;
            bsum -= boutsum;

            stackstart = stackpointer - radius + div;
            sir = stack[stackstart % div];

            routsum -= sir[0];
            goutsum -= sir[1];
            boutsum -= sir[2];

            if (x == 0) {
                vmin[y] = Math.min(y + r1,hm) * w;
            }
            p = x + vmin[y];

            sir[0] = r[p];
            sir[1] = g[p];
            sir[2] = b[p];

            rinsum += sir[0];
            ginsum += sir[1];
            binsum += sir[2];

            rsum += rinsum;
            gsum += ginsum;
            bsum += binsum;

            stackpointer = (stackpointer + 1) % div;
            sir = stack[stackpointer];

            routsum += sir[0];
            goutsum += sir[1];
            boutsum += sir[2];

            rinsum -= sir[0];
            ginsum -= sir[1];
            binsum -= sir[2];

            yi += w;
        }
    }

    Log.e("pix",w + " " + h + " " + pix.length);
    bitmap.setPixels(pix,h);

    return (bitmap);
}

解决方法

Android上的模糊效果总是很难.基本上你必须在外观和性能之间做出决定.模糊看起来越长越好,如果模糊本身不是瞬间的,那么你就无法真正为模糊设置动画.

你原始的模糊算法产生了非常好的结果,但由于这一点,它也很慢,使模糊动画不可能.为了演示如何有效地模糊这个图像,我通过缩放位图来创建一个简单的模糊动画:

public class BlurAnimation extends Animation {

    private final ImageView imageView;
    private final Bitmap bitmap;
    private final float startValue;
    private final float stopValue;
    private final float difValue;

    private BlurAnimation(ImageView imageView,Bitmap bitmap,int startValue,int stopValue) {
        this.imageView = imageView;
        this.bitmap = bitmap;
        this.startValue = startValue;
        this.stopValue = stopValue;
        this.difValue = stopValue - startValue;
    }

    @Override
    protected void applyTransformation(float interpolatedTime,Transformation t) {
        super.applyTransformation(interpolatedTime,t);

        int current = (int)(this.difValue * interpolatedTime + this.startValue + 0.5f);
        Bitmap blurred = quickBlur(this.bitmap,current);
        this.imageView.setimageBitmap(blurred);
    }

    public Bitmap quickBlur(Bitmap bitmap,int factor) {
        if(factor <= 0) {
            return Bitmap.createBitmap(1,1,Bitmap.Config.ARGB_8888);
        }
        return Bitmap.createScaledBitmap(bitmap,bitmap.getWidth() / factor,bitmap.getHeight() / factor,true);
    }
}

这很有效(即使仍有一些滞后),但结果无法与您的模糊算法进行比较,它看起来很糟糕:

所以你看,在模糊图像时很难将性能和美观结合起来,但有一些选项首先是RenderScript. RenderScript速度非常快,并且内置高斯模糊滤镜.我从来没有使用它,但从我听到它可能是你的问题的解决方案.

您还可以尝试加载图像的已缩小版本,这将产生与上面的gif相同的效果,但会更快.缺点是在动画中使用它也是有问题的,但是如果你只是需要一个模糊的图像而你并不真正关心质量,那么你应该选择这个选项.

您可以找到有关RenderScript和其他快速模糊选项in this answer的更多信息

Android ImageView模糊动画的更多相关文章

  1. Android ImageView模糊动画

    我想在ImageView中添加模糊动画,但设置持续时间.所以,例如,我希望图像随着时间的推移而模糊.我已经有了模糊图像的方法,但我需要的是让它从模糊变为无模糊,比如2秒.有人可以帮帮我吗?

  2. Canvas实现放大镜效果完整案例分析(附代码)

    这篇文章主要介绍了Canvas实现放大镜效果完整案例分析(附代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. regex – 模糊正则表达式

    我正在寻找一种方法使用正则表达式进行模糊匹配。我想使用Perl,但如果有人可以推荐任何方式来做这将是有帮助的。根据我的理解,我不能使用String::ApproxPerl模块来做到这一点,因为我需要在我的匹配中包含一个正则表达式。q-gram距离不能像“York”这样的单词很好地工作,但是如果你的典型模式是一个完整的地址,那应该很好。>当通过qgram命中提高分数时,您可以通过其他事情调整值1,如文本的长度差异vs模式。

  4. Windows 7的任务栏(启用了MainFormOnTaskbar)的Delphi窗体图标模糊

    什么是确保使用Delphi编写的应用程序在Windows7的任务栏中使用正确的图标分辨率的最佳方法?

  5. java – 使用原始类型和包装类的varargs重载时为什么会出现模糊错误?

    参见英文答案>Ambiguousvarargsmethods4个我不明白为什么在这里的情况1,它没有给出编译错误,相反在情况2(varargs),它给出了编译错误.任何人都可以详细说明编译器在这两种情况下的差异吗?我经历了很多关于它的帖子,但还不能理解它.情况1输出为:1案例#2编译错误:解决方法在第一个示例中,display(int)方法在严格调用上下文中调用,而display(Integer)

  6. c# – 实现智能搜索/模糊字符串比较

    我在ASP.NETMVC应用程序上有一个网页,客户可以在其中搜索供应商.供应商在网站上捕获他们自己的详细信息.客户想要一个“智能搜索”功能,即使供应商拼写与搜索框中输入的内容“略有不同”,他们也可以搜索供应商并找到它们.我不知道客户的“略有不同”的概念是什么.我一直在研究实现自定义soundex算法.这会根据声音的方式将单词转换为数字.然后将该数字用于比较.例如:ZachZack将编码为相同的值.还有其他我可以考虑的选择吗?

  7. UIImage在缩放时变得模糊.为什么(iOS 5.0)

    UIImage在缩放时总是变得模糊.如果让它保持清晰,我该怎么办?

  8. Cocos2d-x shader学习2: 模糊(Blur)

    模糊是shader中较为简单的一种应用。cocos2dx3.x给的demo中,就有sprite的模糊的效果。uniform变量是顶点着色器和片段着色器共享使用的变量,uniform的值不能被改变。uniform变量是由宿主程序设置的,代码如下:这里宿主程序设置了resolution,blurRadius和sampleNum三个uniform变量。resolution是当前渲染node的实际分辨率。最终的颜色值就是col/count。

  9. ps 径向模糊算法glsl

    下面介绍的是opengl实现的径向模糊,可用于实现放射性效果。其基本思想是模糊沿着中心点向外一条直线上的点,采样值可以自己确定,效果好就ok了、、~效果图:

  10. 模糊C均值算法是否适用于Python?

    我在三维空间中有一些点,并希望对它们进行聚类.我知道Pythons模块“集群”,但它只有K-Means.你知道一个有FCM的模块吗?MATLAB在Matlab中使用FCM似乎很容易.Python不是这样吗?

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部