一分钟实现动态模糊效果
现在,越来越多的App里面使用了模糊效果,尤其是动效效果中尤为常见。
对于这类需求,Android推出RenderScript。测试表明,使用RenderScript的渲染效率和使用C/C++不相上下,但是使用RenderScript却比使用JNI简单地多!同时,Android团队提供了RenderScript的支持库,使得在低版本的Android平台上也能使用。
RenderScript实现
代码实现
/*** Created by hangli on 2018/11/27.*/public class BlurBitmap {/*** 图片缩放比例*/private static final float BITMAP_SCALE = 0.4f;/*** 最大模糊度(在0.0到25.0之间)*/private static final float BLUR_RADIUS = 25f;/*** 模糊图片的具体方法** @param context 上下文对象* @param image 需要模糊的图片* @return 模糊处理后的图片*/public static Bitmap blur(Context context, Bitmap image) {// 计算图片缩小后的长宽int width = Math.round(image.getWidth() * BITMAP_SCALE);int height = Math.round(image.getHeight() * BITMAP_SCALE);// 将缩小后的图片做为预渲染的图片。Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);// 创建一张渲染后的输出图片。Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);// 创建RenderScript内核对象RenderScript rs = RenderScript.create(context);// 创建一个模糊效果的RenderScript的工具对象ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));// 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间。// 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去。Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);// 设置渲染的模糊程度, 25f是最大模糊度blurScript.setRadius(BLUR_RADIUS);// 设置blurScript对象的输入内存blurScript.setInput(tmpIn);// 将输出数据保存到输出内存中blurScript.forEach(tmpOut);// 将数据填充到Allocation中tmpOut.copyTo(outputBitmap);return outputBitmap;}
}
由于是Android是在api19,也就是Android4.4以后,才提供了RenderScript的支持库。因此,完成上面的代码后,还需要在app的gradle文件中添加如下的支持:
defaultConfig {......renderscriptTargetApi 19renderscriptSupportModeEnabled true
}
对比结果
将图片模糊后,接下来要考虑的是怎么实现动态模糊效,有一点需要注意的是,即使我们使用了RenderScript这种高效的渲染方式,对于手机的性能有一定的要求,严重时会造成界面严重的卡顿。
因此,我在网上找到另一种方法:先将图片进行最大程度的模糊处理,再将原图放置在模糊后的图片上面,通过不断改变原图的透明度(Alpha值)来实现动态模糊效果。事实上项目里的我们也是这样做的。
动态模糊效果实现
代码如下
public class MainActivity extends AppCompatActivity {/*** 原始图片控件*/private ImageView mOriginImg;/*** 模糊后的图片控件*/private ImageView mBluredImage;/*** 进度条SeekBar*/private SeekBar mSeekBar;/*** 显示进度的文字*/private TextView mProgressTv;/*** 透明度*/private int mAlpha;/*** 原始图片*/private Bitmap mTempBitmap;/*** 模糊后的图片*/private Bitmap mFinalBitmap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化视图initViews();// 获取图片mTempBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.test);mFinalBitmap = BlurBitmap.blur(this, mTempBitmap);// 填充模糊后的图像和原图mBluredImage.setImageBitmap(mFinalBitmap);mOriginImg.setImageBitmap(mTempBitmap);// 处理seekbar滑动事件setSeekBar();}/*** 初始化视图*/private void initViews() {mBluredImage = (ImageView) findViewById(R.id.activity_main_blured_img);mOriginImg = (ImageView) findViewById(R.id.activity_main_origin_img);mSeekBar = (SeekBar) findViewById(R.id.activity_main_seekbar);mProgressTv = (TextView) findViewById(R.id.activity_main_progress_tv);}/*** 处理seekbar滑动事件*/private void setSeekBar() {mSeekBar.setMax(100);mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {mAlpha = progress;mOriginImg.setAlpha((int) (255 - mAlpha * 2.55));mProgressTv.setText(String.valueOf(mAlpha));}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:layout_width="match_parent"android:layout_weight="1"android:layout_height="0dp"><ImageViewandroid:id="@+id/activity_main_blured_img"android:scaleType="centerCrop"android:src="@mipmap/dayu"android:layout_width="match_parent"android:layout_height="match_parent"/><ImageViewandroid:id="@+id/activity_main_origin_img"android:scaleType="centerCrop"android:layout_width="match_parent"android:layout_height="match_parent"/></FrameLayout><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="80dp"><SeekBarandroid:layout_marginTop="20dp"android:id="@+id/activity_main_seekbar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"/><TextViewandroid:id="@+id/activity_main_progress_tv"android:text="0"android:textSize="24sp"android:layout_gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout></LinearLayout>
动态效果
一分钟实现动态模糊效果相关推荐
- 教你一分钟实现动态模糊效果
转载请注明出处:http://blog.csdn.net/wl9739/article/details/51955598 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 现在,越来 ...
- android+动态模糊效果,Android 动态高斯模糊效果教程
写在前面 最近一直在做毕设项目的准备工作,考虑到可能要用到一个模糊的效果,所以就学习了一些高斯模糊效果的实现.比较有名的就是 FastBlur 以及它衍生的一些优化方案,还有就是今天要说的Render ...
- css如何添加模糊效果,css动态模糊效果
实例效果:请把鼠标放上去看看 第一步:把下面的脚本插入 与之间: function on(she){ girl=she move=setInterval("moving(girl)" ...
- 原生JS实现抛物线动画以及动态模糊效果
苏格团队 作者:Jason 前言 某一天我收到了产品发来的微信消息.小X,我们的业务现在需要一个类似加入购物车的掉落动画,经过组织的慎重考虑,这个需求就交给你了.于是便有了这篇文章.本文并没有描述多少 ...
- 5分钟实现动态切换,原来迁徙图还可以这么玩!
某航空公司领导想看十一假期间北京.上海.广州.深圳等城市的人流量情况,要求用迁徙图展示,默认以北京为出发地,显示由北京到全国各个城市的人流量情况,点击地图上某个城市,可以动态切换该城市为出发地,显示由 ...
- android ios动态模糊效果,iOS实现模糊效果的几种方法
iOS系统中大量使用了模糊效果,背景模糊,使得靠前的内容更容易获得用户的关注,自己开发中肯定也遇到过样的需求.今天就总结一下常用的实现模糊效果的方法,目录如下图: 本篇demo:iOS常用模糊效果de ...
- RenderScript:简单实现动态模糊效果
见过很多毛玻璃的效果,当然也有很多实现毛玻璃效果的方法,这是写的一个毛玻璃效果的小例子,简单记录下 思路: 动态设置模糊效果,可以看成是两张图片的叠加,通过设置其中一张图片的透明度,从而实现动态模糊的 ...
- 导航条动态模糊效果实现原理实战
jquery.clone()方法实现视口滚动导航栏菜单模糊效果 上微博时发现,在我向下看内容的时候,发现内容滚动到顶部的导航栏就变模糊了,觉得很有趣,就自己尝试的去写一个试试 参考微博的实例: 具体步 ...
- 双11财务报表怎么做?不用Excel,10分钟学会动态可视化报表
双11昨天过去了,不知道各位剁手剁的怎么样?反正淘宝的销售额又上了一个台阶,快递小哥哥们辛苦了. 同样辛苦的还有我们的财务同学(手动滑稽),你的Excel已经在等着你了,准备好加班加点做财务报表吧.不 ...
最新文章
- SAP MM GR-based IV, 无GR不能IV?
- java rt maven_java – Maven无法使用rt.jar进行编译
- C# 使用new 关键字显式隐藏从基类继承的成员和内部类的使用
- 【面试测试题】贪婪是好事
- 买了又扔 戴尔放弃vworkspace虚拟桌面
- Python两个版本共存时,命令行升级pip
- SQL ORDER BY 两个列
- 闲鱼前端基于serverless的一种多端开发解决方案
- linux中执行历史第五个命令,Linux 快速执行历史命令,用 !编号
- 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)...
- opendir是安全重入函数吗_redis实现分布式锁,与jdk可重入锁ReentrantLock的原理对比剖析...
- 传输层协议(7):滑动窗口(1)
- Use Jet OLE DB Provider 4.0 to Connect to ISAM Databases (连接Excel, Text等数据库)
- 单链表反转--Java实现
- ubuntu16.04解压cudnn文件时报错,could not create a hard link file://xxx/cuda/lib64/libcudnn_static.a不完全解决方案
- 物联网关键技术————传感器技术
- jave wed 2
- 朋友圈加粗字体数字_报名 | 零基础入门brush lettering英文花式字体
- android entries属性,ListPreference需要设置两个属性:android:entries和android:entryValues...
- Macos 安装MacTex SublimeText3 Skim环境