最近换了工作,由于工作中要使用一些自己以前不是很了解的知识,就没有时间更新博客了。

由于最近做了一些很有意思的小demo,不吐不快,再加上还是认为技术需要沉淀和梳理,所以再次把写博客这件事拾起来。

已经不是第一次遇到设计师要求使用毛玻璃效果了,但是做带毛玻璃效果背景的Dialog还是第一次。考虑实现的逻辑,弹出Dialog之前对当前屏幕截图,做高斯模糊处理,设为Dialog背景,显示Dialog。

屏幕截图核心代码public static Bitmap takeScreenShot(Activity activity) {

// View是你需要截图的View

View view = activity.getWindow().getDecorView();

view.setDrawingCacheEnabled(true);

view.buildDrawingCache();

Bitmap b1 = view.getDrawingCache();

// 获取状态栏高度

Rect frame = new Rect();

activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);

int statusBarHeight = frame.top;

// 获取屏幕长和高

int width = activity.getWindowManager().getDefaultDisplay().getWidth();

int height = activity.getWindowManager().getDefaultDisplay()

.getHeight();

// 去掉标题栏

Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight);

Matrix matrix = new Matrix();

matrix.postScale(0.2f,0.2f); //长和宽放大缩小的比例

// 压缩 丢弃一部分像素点

b = Bitmap.createBitmap(b,0,0,b.getWidth(),b.getHeight(),matrix,true);

b = FastBlur.doBlur(b, 4, true);

view.destroyDrawingCache();

return b;

}

做压缩的目的是丢弃一部分像素点,保证做高斯模糊处理时的效率。既然要做高斯模糊,那么就意味着图片对精度的要求极低。

FastBlur类(高斯模糊)

这个类来自于开源项目StackBlur的早期源码,感兴趣的可以使用最新的源码来替换。public class FastBlur {

public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {

// Stack Blur v1.0 from

// http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html

//

// Java Author: Mario Klingemann

// http://incubator.quasimondo.com

// created Feburary 29, 2004

// Android port : Yahel Bouaziz

// http://www.kayenko.com

// ported april 5th, 2012

// This is a compromise between Gaussian Blur and Box blur

// It creates much better looking blurs than Box Blur, but is

// 7x faster than my Gaussian Blur implementation.

//

// I called it Stack Blur because this describes best how this

// filter works internally: it creates a kind of moving stack

// of colors whilst scanning through the image. Thereby it

// just has to add one new block of color to the right side

// of the stack and remove the leftmost color. The remaining

// colors on the topmost layer of the stack are either added on

// or reduced by one, depending on if they are on the right or

// on the left side of the stack.

//

// If you are using this algorithm in your code please add

// the following line:

//

// Stack Blur Algorithm by Mario Klingemann

Bitmap bitmap;

if (canReuseInBitmap) {

bitmap = sentBitmap;

} else {

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

bitmap.getPixels(pix, 0, w, 0, 0, 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;

}

}

bitmap.setPixels(pix, 0, w, 0, 0, w, h);

return (bitmap);

}

}

Dialog的布局我就不赘述了,另外可以根据需要修改Stylefalse

true

@android:color/transparent

得到自己想要的效果。

最后,附上效果图

本文出自Yang,转载时请注明出处及相应链接。

android 开源 高斯模糊_Android实现带毛玻璃效果(高斯模糊)背景的Dialog相关推荐

  1. Android高效率实现弹出带动画效果的对话框,仿照微信对话框效果

    转载请注明出处: http://blog.csdn.net/jakeyangchina/article/details/53423453 看到很多app页面里都有弹出对话框效果,今天使用PopupWi ...

  2. android 开源 高斯模糊_Android高斯模糊技术,实现毛玻璃效果(转)

    Java动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之 ...

  3. android view禁用,Android 禁止ViewPager的自带滑动效果

    由于最近在做墨水屏的相关工作,ViewPager自带的滑动效果在墨水屏上表现的很不好,残影太重了.所以禁止自带的滑动效果,用接口来接管相关逻辑实现自处理. import android.content ...

  4. android 头像球_Android实现圆形头像效果

    效果截图 image.png 实现原理 对于圆形头像的实现,其实就是对方形图像做某些处理,以达到圆形头像的效果.一般我们会通过Canvas和Paint结合来实现这种效果. 自定义View来实现 因为圆 ...

  5. android 辐射动画_Android 四种动画效果的调用实现代码

    (1) main.xml 代码如下:(声明四个按钮控件) XML代码: android:id="@+id/widget32" android:layout_width=" ...

  6. 【css】毛玻璃效果,背景高斯模糊

    关键属性:backdrop-filter 参考了Apple 官网,参数与 Apple 官网一致 // 背景高斯模糊 @supports (-webkit-backdrop-filter: satura ...

  7. 【Android】炫酷ui 带你做一个背景跟着滚动的工具

    在用ViewPager配合Fragment开发的模式中,想做一个类似于桌面壁纸的背景图,可以跟着ViewPager滑动.这里贴一下项目初期实现了的效果: 可以看到,界面中ViewPager滑动的同时背 ...

  8. android 开源 高斯模糊_Android图像处理 - 高斯模糊的原理及实现

    欢迎大家前往由 前言 高斯模糊是图像处理中几乎每个程序员都或多或少听过的名词,但是对其原理大家可能并不了解,只知道通过高斯模糊能实现图像毛玻璃效果. 本文首先介绍图像处理中最基本的概念:卷积:随后介绍 ...

  9. Android 开源项目及网址

    网站: Github:https://github.com/Trinea/android-open-project 泡在网上的日子:http://www.jcodecraeer.com/ 掘金:htt ...

最新文章

  1. 提取so文件的特征值
  2. PostgreSQL的initdb 源代码分析之五
  3. SQL Server 2008 复习(一)
  4. ios retain 与 copy 的区别
  5. 结婚虽易,终老不易:EntityFramework和AutoMapper的婚后生活
  6. 记一次高io wait问题分析及解决-设置合理的SGA
  7. Zilliqa的设计构思 第1部分:网络分片
  8. 一种内存泄露检查和定位的方法
  9. Java json字符串转Object
  10. 关于struts2 获取页面表单信息的个人做法
  11. 令人蛋疼的错误提示 0xcdcdcdcd ,0xdddddddd ,0xfeeefeee ,0xcccccccc ,0xabababab
  12. vue 播放.aac格式的音频文件
  13. 如何成为一个合格的数据分析师
  14. 【开源教程2】疯壳·开源编队无人机-硬件资源简介
  15. 一维离散余弦变换(DCT)及其反变换(IDCT)公式的一种推导
  16. Android中 Rect类
  17. 敷衍的面试|记录问题仅供参考,不代表最终答案
  18. TesterHome android app 编写历程(二)
  19. win10平板续航测试软件,Win10平板必备工具!触摸屏虚拟鼠标应用推荐
  20. vue通过v-for取出的一个字段是时间戳格式转换成年月日

热门文章

  1. 用 Python 写出这样的进度条,刷新了我对进度条的认知
  2. finalize到底是什么
  3. 数学-矩阵计算(1)矩阵和向量的求导法则
  4. C#中关于updatePanel与freeTextBox不兼容的问题 当页面刷子新后,ftb不能输入内容的解决办法
  5. 提示word损坏,需文本恢复转换器的解决两方法
  6. 代码简洁的上方滑动门(选项卡tab)jquery插件可重复使用,淡入淡出效果(用)
  7. @scheduled注解配置时间_Spring Boot中使用@Scheduled创建定时任务
  8. PointConv论文阅读笔记
  9. 《Hierarchical Attention Network for Document Classification》—— 用于文本分类的层次注意力网络
  10. LSTM模型结合LDA对序列性文本建模 阅读笔记 2017 ICML