android 模糊组件,动态模糊组件 HokoBlur
动态模糊组件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)第 ...
- android形状属性、锁屏密码、动态模糊、kotlin项目、抖音动画、记账app、视频播放器等源码
Android精选源码 直观了解Android的"形状"属性如何影响Drawable的外观. 一个灵活的视频播放器, 可替换播放器内核. android锁屏输入密码功能源码 背景动 ...
- vue 带全选和多选的表格怎么写_vue实现下拉列表多选全选以及模糊查询的vue组件...
vue实现下拉列表多选全选以及模糊查询的vue组件 发布时间:2018-09-12 17:41, 浏览次数:3776 , 标签: vue <>前端,有时有这样的需求,需要一个下拉列表,还要 ...
- Android开发精要2--Android组件模型解析
本文的主要内容如下: 2.1 基于Mashup的应用设计 2.2 界面组件Activity解析 2.3 服务组件Service解析 2.4 触发器组件BroadcastReceiver解析 2.5 数 ...
- Unity3D 背景动态模糊(blur)和截屏方法
unity 提供了一个函数 OnRenderImage (RenderTexture source, RenderTexture destination) ,只要将这个组件挂载在Camera上面.就能 ...
- [Android Pro] 由模块化到组件化(一)
cp from : https://blog.csdn.net/dd864140130/article/details/53645290 在Android SDK一文中,我们谈到模块化和组件化,现在我 ...
- 3.Android学习之常用UI组件(一)
目录 3.常用UI组件(一) 1.文本类组件 1-1.文本框(TextView) 1-2.编辑框(EditText) 2.按钮类组件 2-1.普通按钮(Button) 2-2.图片按钮(ImageBu ...
- Android自定义导览地图组件(一)
丨版权说明 : <Android自定义导览地图组件(一)>于当前CSDN博客和乘月网属同一原创,转载请说明出处,谢谢. 鉴于Android关于自定义导览地图的相关资料以及 ...
- Android 开发:由模块化到组件化(一)
在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...
最新文章
- 介绍html CSS和JS的定义或引用
- 邮件服务器轻松组建 友旺MG1200功能介绍
- python游戏最简单代码-如何利用Python开发一个简单的猜数字游戏
- 最优布线问题(克鲁斯卡尔)
- Android ImageView图片自适应
- 通过jQuery源码学习javascript(三)
- jmeter进行性能测试_使用JMeter进行性能测试
- android将字符串转化为json,将字符串转换为JSON数组
- windows窗口 matlab,windows – 有没有办法改变MATLAB命令窗口的标题?
- JeecgCloud 微服务开发平台-部署文档
- Python使用字典get()方法TypeError: get() takes no keyword arguments
- iOS UIView异步绘制实现圆角的方案
- 通过dll来引用webservice的方法(.net)
- Java爬虫学习——实例:获取起点中文网站小说并保存成txt文件
- AWD系统加固,系统渗透笔记
- 查看已安装Tomcat的版本号
- 我国数据安全法详细解读
- SCU - 4437 Carries
- P1017 进制转换 (洛谷)
- 高级技巧之vertical-align属性应用
热门文章
- SAP那些事-职业篇-10-顾问最重要的思维方式
- Java断言(assert)的介绍和使用
- 【操作系统实验】Linux环境下用进程实现哲学家进餐问题——C语言完整代码+详细实验报告
- 关于单级PID及串级PID
- C++中string.size()函数 踩坑
- 新媒体运营的岗位晋升路线是怎么样的? 新媒体管理师是趋势吗?
- 【C语言】操作符 ~ ,二进制位按位取反
- iOS10 适配 ATS(app支持https通过App Store审核) 韩俊强的博客
- 无线安全[测试标准]
- STM32 cubeIDE 堆栈大小设置