动态模糊组件HokoBlur

1. 描述

组件主要提供以下功能:

给图片添加模糊效果;

动态模糊,对背景的实时模糊。

组件主要的特性:

多种实现方案,包括RenderScript、OpenGL、Native和Java;

多种算法,包括Box、Stack和Gaussian算法,满足不同的模糊效果;

多核多线程,提升模糊效率,增加异步调用Api;

:rocket:类似iOS的动态背景模糊,相比使用RenderScript处理Bitmap的动态模糊方案,具有更好的效果和性能

2. 原理及性能分析

可以参考这里。

3.使用姿势

3.1 API调用

完整的api如下

HokoBlur.with(context)

.scheme(Blur.SCHEME_NATIVE) //设置模糊实现方案,包括RenderScript、OpenGL、Native和Java实现,默认为Native方案

.mode(Blur.MODE_STACK) //设置模糊算法,包括Gaussian、Stack和Box,默认并推荐选择Stack算法

.radius(10) //设置模糊半径,内部最大限制为25,默认值5

.sampleFactor(2.0f) // 设置scale因子,factor = 2时,内部将bitmap的宽高scale为原来的 1/2,默认值5

.forceCopy(false) //对于scale因子为1.0f时,会直接修改传入的bitmap,如果你不希望修改原bitmap,设置forceCopy为true即可,默认值false

.needUpscale(true) //设置模糊之后,是否upscale为原Bitmap的尺寸,默认值true

.translateX(150)//可对部分区域进行模糊,这里设置x轴的偏移量

.translateY(150)//可对部分区域进行模糊,这里设置y轴的偏移量

.processor() //获得模糊实现类

.blur(bitmap);//模糊图片,方法是阻塞的,底层为多核并行实现,异步请使用asyncBlur

日常并不需要如此复杂的参数设置,如果单纯只是想添加模糊效果,可以这样调用:

//doBlur()将返回模糊后的Bitmap

Bitmap outBitmap = Blur.with(context).processor().blur(bitmap);

对于尺寸很大的图,建议使用异步的方式调用

HokoBlur.with(this)

.scheme(Blur.SCHEME_NATIVE)

.mode(Blur.MODE_STACK)

.radius(10)

.sampleFactor(2.0f)

.forceCopy(false)

.needUpscale(true)

.processor()

.asyncBlur(bitmap, new AsyncBlurTask.CallBack() {

@Override

public void onBlurSuccess(Bitmap outBitmap) {

// do something...

}

@Override

public void onBlurFailed() {

}

});

3.2 效果展示

动画

任意部位模糊

较高的模糊处理效率,可以实现任意部位的实时模糊。实际并不需要特别大尺寸的图只需要选取屏幕的一部分即可。

4. 动态模糊

动态模糊提供了对View以及ViewGroup的实时背景模糊,并不是针对Bitmap的实现。组件将会对View所在区域进行模糊。

为View添加背景模糊,只需要将BlurDrawable设置为View背景即可。

final BlurDrawable blurDrawable = new BlurDrawable();

View view = findViewById(R.id.test_view);

view.setBackgroundDrawable(blurDrawable);

模糊参数的调整,可以这样操作:

blurDrawable.mode(mode)

blurDrawable.radius(radius)

blurDrawable.sampleFactor(factor)

禁用/开启背景模糊

blurDrawable.disableBlur();

blurDrawable.enableBlur();

组件已包含实现背景模糊的三种常用ViewGroup,包括BlurFrameLayout、BlurLinearLayout和BlurRelativeLayout。

使用示例:

// 模糊动画

ValueAnimator animator = ValueAnimator.ofInt(0, 20);

animator.setDuration(2000);

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

mFrameLayout.getBlurDrawable().setBlurRadius((Integer) animation.getAnimatedValue());

}

});

gif图较大,稍等片刻

5. 配置

动态模糊正常工作,需要在混淆时加入下面的规则:

-keep class com.hoko.blurlibrary.opengl.functor.** { *; }

6. 注意事项

当未对Bitmap进行scale操作(sampleFactor(1.0f)),传入的Bitmap将会被之后的操作直接修改。所以当函数返回某个bitmap的时候,可以被立刻使用到控件上面去。

强烈建议使用在模糊操作之前,进行downScale操作,降低被模糊图片的大小,这将大幅提升模糊效率和效果。

请将模糊半径限制在25内(组件内部同样进行了限制),增加半径对模糊效果的提升远小于通过增加scale的缩放因子的方式,而且半径增加模糊效率也将降低;

RenderScript方案因为兼容性有待验证,如果有需要更大计算量和更复杂模糊效果的场景,可以考虑RenderScript方案。

算法的选择

如果你对模糊效果要求不高,同时希望较快完成图片的模糊,请选择Box算法;

如果你对模糊效果要求较高,同时可以忍受较慢完成图片的模糊,请选择Gaussian算法;

Stack算法有非常接近Gaussian算法的模糊效果,同时提升了算法效率,一般情况下使用Stack算法即可;

BlurDrawable通过OpenGL实现,因此如果页面未开启硬件加速,背景模糊将无效。

示例与用法

具体示例详见组件工程

android 模糊组件,动态模糊组件 HokoBlur相关推荐

  1. 动态模糊神经网络用于自学习

    动态模糊神经网络 动态模糊神经网络  输入语言变量  系统输出  是第个输入变量的第个隶属函数  表示第条模糊规则  是第个归一化节点  是第个规则的结果参数或连接权  是指系统的总的规则数 (1)第 ...

  2. android形状属性、锁屏密码、动态模糊、kotlin项目、抖音动画、记账app、视频播放器等源码

    Android精选源码 直观了解Android的"形状"属性如何影响Drawable的外观. 一个灵活的视频播放器, 可替换播放器内核. android锁屏输入密码功能源码 背景动 ...

  3. vue 带全选和多选的表格怎么写_vue实现下拉列表多选全选以及模糊查询的vue组件...

    vue实现下拉列表多选全选以及模糊查询的vue组件 发布时间:2018-09-12 17:41, 浏览次数:3776 , 标签: vue <>前端,有时有这样的需求,需要一个下拉列表,还要 ...

  4. Android开发精要2--Android组件模型解析

    本文的主要内容如下: 2.1 基于Mashup的应用设计 2.2 界面组件Activity解析 2.3 服务组件Service解析 2.4 触发器组件BroadcastReceiver解析 2.5 数 ...

  5. Unity3D 背景动态模糊(blur)和截屏方法

    unity 提供了一个函数 OnRenderImage (RenderTexture source, RenderTexture destination) ,只要将这个组件挂载在Camera上面.就能 ...

  6. [Android Pro] 由模块化到组件化(一)

    cp from : https://blog.csdn.net/dd864140130/article/details/53645290 在Android SDK一文中,我们谈到模块化和组件化,现在我 ...

  7. 3.Android学习之常用UI组件(一)

    目录 3.常用UI组件(一) 1.文本类组件 1-1.文本框(TextView) 1-2.编辑框(EditText) 2.按钮类组件 2-1.普通按钮(Button) 2-2.图片按钮(ImageBu ...

  8. Android自定义导览地图组件(一)

    丨版权说明 : <Android自定义导览地图组件(一)>于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢.          鉴于Android关于自定义导览地图的相关资料以及 ...

  9. Android 开发:由模块化到组件化(一)

    在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...

最新文章

  1. 介绍html CSS和JS的定义或引用
  2. 邮件服务器轻松组建 友旺MG1200功能介绍
  3. python游戏最简单代码-如何利用Python开发一个简单的猜数字游戏
  4. 最优布线问题(克鲁斯卡尔)
  5. Android ImageView图片自适应
  6. 通过jQuery源码学习javascript(三)
  7. jmeter进行性能测试_使用JMeter进行性能测试
  8. android将字符串转化为json,将字符串转换为JSON数组
  9. windows窗口 matlab,windows – 有没有办法改变MATLAB命令窗口的标题?
  10. JeecgCloud 微服务开发平台-部署文档
  11. Python使用字典get()方法TypeError: get() takes no keyword arguments
  12. iOS UIView异步绘制实现圆角的方案
  13. 通过dll来引用webservice的方法(.net)
  14. Java爬虫学习——实例:获取起点中文网站小说并保存成txt文件
  15. AWD系统加固,系统渗透笔记
  16. 查看已安装Tomcat的版本号
  17. 我国数据安全法详细解读
  18. SCU - 4437 Carries
  19. P1017 进制转换 (洛谷)
  20. 高级技巧之vertical-align属性应用

热门文章

  1. SAP那些事-职业篇-10-顾问最重要的思维方式
  2. Java断言(assert)的介绍和使用
  3. 【操作系统实验】Linux环境下用进程实现哲学家进餐问题——C语言完整代码+详细实验报告
  4. 关于单级PID及串级PID
  5. C++中string.size()函数 踩坑
  6. 新媒体运营的岗位晋升路线是怎么样的? 新媒体管理师是趋势吗?
  7. 【C语言】操作符 ~ ,二进制位按位取反
  8. iOS10 适配 ATS(app支持https通过App Store审核) 韩俊强的博客
  9. 无线安全[测试标准]
  10. STM32 cubeIDE 堆栈大小设置