android 开源 高斯模糊_Android实现带毛玻璃效果(高斯模糊)背景的Dialog
最近换了工作,由于工作中要使用一些自己以前不是很了解的知识,就没有时间更新博客了。
由于最近做了一些很有意思的小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相关推荐
- Android高效率实现弹出带动画效果的对话框,仿照微信对话框效果
转载请注明出处: http://blog.csdn.net/jakeyangchina/article/details/53423453 看到很多app页面里都有弹出对话框效果,今天使用PopupWi ...
- android 开源 高斯模糊_Android高斯模糊技术,实现毛玻璃效果(转)
Java动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之 ...
- android view禁用,Android 禁止ViewPager的自带滑动效果
由于最近在做墨水屏的相关工作,ViewPager自带的滑动效果在墨水屏上表现的很不好,残影太重了.所以禁止自带的滑动效果,用接口来接管相关逻辑实现自处理. import android.content ...
- android 头像球_Android实现圆形头像效果
效果截图 image.png 实现原理 对于圆形头像的实现,其实就是对方形图像做某些处理,以达到圆形头像的效果.一般我们会通过Canvas和Paint结合来实现这种效果. 自定义View来实现 因为圆 ...
- android 辐射动画_Android 四种动画效果的调用实现代码
(1) main.xml 代码如下:(声明四个按钮控件) XML代码: android:id="@+id/widget32" android:layout_width=" ...
- 【css】毛玻璃效果,背景高斯模糊
关键属性:backdrop-filter 参考了Apple 官网,参数与 Apple 官网一致 // 背景高斯模糊 @supports (-webkit-backdrop-filter: satura ...
- 【Android】炫酷ui 带你做一个背景跟着滚动的工具
在用ViewPager配合Fragment开发的模式中,想做一个类似于桌面壁纸的背景图,可以跟着ViewPager滑动.这里贴一下项目初期实现了的效果: 可以看到,界面中ViewPager滑动的同时背 ...
- android 开源 高斯模糊_Android图像处理 - 高斯模糊的原理及实现
欢迎大家前往由 前言 高斯模糊是图像处理中几乎每个程序员都或多或少听过的名词,但是对其原理大家可能并不了解,只知道通过高斯模糊能实现图像毛玻璃效果. 本文首先介绍图像处理中最基本的概念:卷积:随后介绍 ...
- Android 开源项目及网址
网站: Github:https://github.com/Trinea/android-open-project 泡在网上的日子:http://www.jcodecraeer.com/ 掘金:htt ...
最新文章
- 提取so文件的特征值
- PostgreSQL的initdb 源代码分析之五
- SQL Server 2008 复习(一)
- ios retain 与 copy 的区别
- 结婚虽易,终老不易:EntityFramework和AutoMapper的婚后生活
- 记一次高io wait问题分析及解决-设置合理的SGA
- Zilliqa的设计构思 第1部分:网络分片
- 一种内存泄露检查和定位的方法
- Java json字符串转Object
- 关于struts2 获取页面表单信息的个人做法
- 令人蛋疼的错误提示 0xcdcdcdcd ,0xdddddddd ,0xfeeefeee ,0xcccccccc ,0xabababab
- vue 播放.aac格式的音频文件
- 如何成为一个合格的数据分析师
- 【开源教程2】疯壳·开源编队无人机-硬件资源简介
- 一维离散余弦变换(DCT)及其反变换(IDCT)公式的一种推导
- Android中 Rect类
- 敷衍的面试|记录问题仅供参考,不代表最终答案
- TesterHome android app 编写历程(二)
- win10平板续航测试软件,Win10平板必备工具!触摸屏虚拟鼠标应用推荐
- vue通过v-for取出的一个字段是时间戳格式转换成年月日
热门文章
- 用 Python 写出这样的进度条,刷新了我对进度条的认知
- finalize到底是什么
- 数学-矩阵计算(1)矩阵和向量的求导法则
- C#中关于updatePanel与freeTextBox不兼容的问题 当页面刷子新后,ftb不能输入内容的解决办法
- 提示word损坏,需文本恢复转换器的解决两方法
- 代码简洁的上方滑动门(选项卡tab)jquery插件可重复使用,淡入淡出效果(用)
- @scheduled注解配置时间_Spring Boot中使用@Scheduled创建定时任务
- PointConv论文阅读笔记
- 《Hierarchical Attention Network for Document Classification》—— 用于文本分类的层次注意力网络
- LSTM模型结合LDA对序列性文本建模 阅读笔记 2017 ICML