iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android开发之毛玻璃效果实例代码
  • 815
分享到

Android开发之毛玻璃效果实例代码

android开发毛玻璃Android 2022-06-06 08:06:05 815人浏览 安东尼
摘要

这是在网上找的,不过忘了在哪里找的,经过很多比较测试,发现这个方法不会 oom,目前来看 我一直没有遇过,今天才找到这个以前建立的工程,记录下来: 先给大家展示下效果图:

这是在网上找的,不过忘了在哪里找的,经过很多比较测试,发现这个方法不会 oom,目前来看 我一直没有遇过,今天才找到这个以前建立的工程,记录下来:

先给大家展示下效果图:


public class FastBlur
{
public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {
// 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 <mario@quasimondo.com>
// 堆栈模糊算法由Mario Klingemann <mario@quasimondo.com>所创作
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);
}
}
public class MainActivity extends AppCompatActivity {
//这个方法不会oom

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView imageView = (ImageView) findViewById(R.id.img);
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.back1);
imageView.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
blur(bitmap, imageView);
return true;
}
});
}
private void blur(Bitmap bkg, View view) {
long startMs = System.currentTimeMillis();
float scaleFactor = 8;
float radius = 20;
Bitmap overlay = Bitmap.createBitmap(
(int) (view.getMeasuredWidth() / scaleFactor),
(int) (view.getMeasuredHeight() / scaleFactor),
Bitmap.Config.ARGB_8888);
canvas canvas = new Canvas(overlay);
canvas.translate(-view.getLeft() / scaleFactor, -view.getTop()
/ scaleFactor);
canvas.scale(1 / scaleFactor, 1 / scaleFactor);
Paint paint = new Paint();
paint.setFlags(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(bkg, 0, 0, paint);
overlay = FastBlur.doBlur(overlay, (int) radius, true);
view.setBackground(new BitmapDrawable(getResources(), overlay));
}
}

以上内容是小编给大家介绍的毛玻璃效果的实例代码,希望对大家有所帮助!

您可能感兴趣的文章:Android毛玻璃背景效果简单实现代码Android中实现iOS中的毛玻璃效果Android利用RenderScript实现毛玻璃模糊效果示例Android 实现图片模糊、高斯模糊、毛玻璃效果的三种方法Android学习教程之图片毛玻璃效果(4)Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)Android模糊处理简单实现毛玻璃效果Android模糊处理实现图片毛玻璃效果Android中实现毛玻璃效果的3种方法Android实现图片毛玻璃背景效果


--结束END--

本文标题: Android开发之毛玻璃效果实例代码

本文链接: https://www.lsjlt.com/news/25047.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android开发Activity毛玻璃背景效果
    本文实例为大家分享了Android开发Activity毛玻璃背景效果的具体代码,供大家参考,具体内容如下 step1:先进行截屏操作 step2:进行毛玻璃处理 毛玻璃处理的原理为先...
    99+
    2022-11-13
    Android Activity毛玻璃背景 Activity毛玻璃效果 Android毛玻璃背景
  • Qt实现简易毛玻璃效果的示例代码
    目录现有功能运行结果源码frosted_glass_label.hfrosted_glass_label.cppmain.cpp现有功能 1.用模糊功能实现简易的毛玻璃效果。 2.鼠...
    99+
    2024-04-02
  • OpenCV-PS扩散毛玻璃效果的实现代码
    实现原理 PS的扩散效果可以产生类似毛玻璃质感的效果,使画面有些毛毛的感觉。其实现可通过操作像素三通道数值的方式实现,定义一个随机数器,将图像中任一点的数值赋值为,以该点为中心一定尺...
    99+
    2024-04-02
  • CSS3中实现毛玻璃效果
    这期内容当中小编将会给大家带来有关CSS3中实现毛玻璃效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。body {    min-height:&nbs...
    99+
    2023-06-08
  • Android中怎么实现毛玻璃背景效果
    这篇文章给大家介绍Android中怎么实现毛玻璃背景效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。思路:     1.使用findViewByid获得需要设置毛玻璃的控件。&...
    99+
    2023-05-30
    android
  • CSS3如何实现毛玻璃效果
    这篇文章主要介绍“CSS3如何实现毛玻璃效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CSS3如何实现毛玻璃效果”文章能帮助大家解决问题。代码如下:body {  ...
    99+
    2023-07-05
  • Android开发中怎么实现一个iOS中的毛玻璃效果
    本篇文章为大家展示了Android开发中怎么实现一个iOS中的毛玻璃效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现代码:<html><head> <meta h...
    99+
    2023-05-31
    android ios roi
  • Android实现毛玻璃效果弹出菜单动画
    本文实例为大家分享了Android实现毛玻璃效果弹出菜单动画的具体代码,供大家参考,具体内容如下 仿ios上屏幕下方向上滑出来的一个模糊菜单,效果如下 原理很简单,页面上原来有...
    99+
    2022-11-13
    Android毛玻璃效果 Android毛玻璃菜单 Android弹出菜单
  • CSS中怎么实现毛玻璃效果
    CSS中怎么实现毛玻璃效果,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。<!DOCTYPE html> &nb...
    99+
    2024-04-02
  • 利用Flutter实现背景图片毛玻璃效果实例
    目录前言使用 canvas 绘制图片更改绘制图片的绘制范围毛玻璃效果实现总结前言 继续我们绘图相关篇章,这次我们来看看如何使用 CustomPaint 实现毛玻璃背景图效果。毛玻璃背...
    99+
    2024-04-02
  • win10预览版10074毛玻璃效果开启方法
      在Build2015大会上公开众多消息的微软,终于正式放出了更名后的首个Win10预览版,增加新特性是开始菜单类似Aero的毛玻璃背景。不过,有些小伙伴在安装后可能看不到效果。尚不确定为何会出现这样的问题,猜测是登录...
    99+
    2023-06-14
    win10 毛玻璃效果 开启 效果 预览
  • 怎么用CSS3实现毛玻璃模糊效果
    这篇文章主要介绍“怎么用CSS3实现毛玻璃模糊效果”,在日常操作中,相信很多人在怎么用CSS3实现毛玻璃模糊效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用CSS3实...
    99+
    2024-04-02
  • css怎么实现毛玻璃效果的方法
    这篇文章将为大家详细讲解有关css怎么实现毛玻璃效果的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是csscss是一种用来表现HTML或XML等文件样式的计算机语言,主要是用来设计网页的样式,使...
    99+
    2023-06-15
  • 如何实现C++语言中的毛玻璃效果
    今天就跟大家聊聊有关如何实现C++语言中的毛玻璃效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在基于Windows Vista的普通Windows应用程序及对话框程序中,如何利用...
    99+
    2023-06-17
  • 如何在Android中使用RenderScript实现一个毛玻璃模糊效果
    今天就跟大家聊聊有关如何在Android中使用RenderScript实现一个毛玻璃模糊效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。RenderScript 介绍在开始之前,先...
    99+
    2023-05-31
    android renderscript ers
  • 如何使用纯CSS实现底层毛玻璃效果
    这篇“如何使用纯CSS实现底层毛玻璃效果”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“如何使用纯CSS实现底层毛玻璃效果”,小编整理了以下知识点,请大家跟着小...
    99+
    2024-04-02
  • win10预览版10074开始菜单毛玻璃效果开启图文教程
    win10预览版10074增加新特性是开始菜单类似Aero的毛玻璃背景。不过,有些小伙伴在安装后可能看不到效果。尚不确定为何会出现这样的问题,猜测是登录微软账户设置被覆盖所致。下文一起来看看win10预览版10074开始...
    99+
    2023-06-14
    开始菜单 win10预览版10074 毛玻璃 效果 开启
  • 如何利用CSS如何实现全兼容的毛玻璃效果
    这篇文章主要讲解了“如何利用CSS如何实现全兼容的毛玻璃效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何利用CSS如何实现全兼容的毛玻璃效果”吧!通过...
    99+
    2024-04-02
  • Opencv 马赛克和毛玻璃效果与图片融合的实现
    目录1.马赛克效果2. 毛玻璃效果3. 图片的融合算法实现1.马赛克效果 马赛克的基本原理就是,用某一个区域的某一个像素点替代这个区域所有的像素点,从而导致图片出现模糊的效果,如下...
    99+
    2024-04-02
  • flutter实现磨砂玻璃效果实例详解
    目录flutter 中实现磨砂玻璃效果编写代码输出效果flutter 中实现磨砂玻璃效果 磨砂玻璃效果是一个很酷的用户界面概念,使我们的用户界面看起来更有吸引力。它基本上是一个模糊的...
    99+
    2022-11-13
    flutter 磨砂玻璃 flutter 磨砂
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作