现在,越来越多的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>

动态效果 

一分钟实现动态模糊效果相关推荐

  1. 教你一分钟实现动态模糊效果

    转载请注明出处:http://blog.csdn.net/wl9739/article/details/51955598 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 现在,越来 ...

  2. android+动态模糊效果,Android 动态高斯模糊效果教程

    写在前面 最近一直在做毕设项目的准备工作,考虑到可能要用到一个模糊的效果,所以就学习了一些高斯模糊效果的实现.比较有名的就是 FastBlur 以及它衍生的一些优化方案,还有就是今天要说的Render ...

  3. css如何添加模糊效果,css动态模糊效果

    实例效果:请把鼠标放上去看看 第一步:把下面的脚本插入 与之间: function on(she){ girl=she move=setInterval("moving(girl)" ...

  4. 原生JS实现抛物线动画以及动态模糊效果

    苏格团队 作者:Jason 前言 某一天我收到了产品发来的微信消息.小X,我们的业务现在需要一个类似加入购物车的掉落动画,经过组织的慎重考虑,这个需求就交给你了.于是便有了这篇文章.本文并没有描述多少 ...

  5. 5分钟实现动态切换,原来迁徙图还可以这么玩!

    某航空公司领导想看十一假期间北京.上海.广州.深圳等城市的人流量情况,要求用迁徙图展示,默认以北京为出发地,显示由北京到全国各个城市的人流量情况,点击地图上某个城市,可以动态切换该城市为出发地,显示由 ...

  6. android ios动态模糊效果,iOS实现模糊效果的几种方法

    iOS系统中大量使用了模糊效果,背景模糊,使得靠前的内容更容易获得用户的关注,自己开发中肯定也遇到过样的需求.今天就总结一下常用的实现模糊效果的方法,目录如下图: 本篇demo:iOS常用模糊效果de ...

  7. RenderScript:简单实现动态模糊效果

    见过很多毛玻璃的效果,当然也有很多实现毛玻璃效果的方法,这是写的一个毛玻璃效果的小例子,简单记录下 思路: 动态设置模糊效果,可以看成是两张图片的叠加,通过设置其中一张图片的透明度,从而实现动态模糊的 ...

  8. 导航条动态模糊效果实现原理实战

    jquery.clone()方法实现视口滚动导航栏菜单模糊效果 上微博时发现,在我向下看内容的时候,发现内容滚动到顶部的导航栏就变模糊了,觉得很有趣,就自己尝试的去写一个试试 参考微博的实例: 具体步 ...

  9. 双11财务报表怎么做?不用Excel,10分钟学会动态可视化报表

    双11昨天过去了,不知道各位剁手剁的怎么样?反正淘宝的销售额又上了一个台阶,快递小哥哥们辛苦了. 同样辛苦的还有我们的财务同学(手动滑稽),你的Excel已经在等着你了,准备好加班加点做财务报表吧.不 ...

最新文章

  1. SAP MM GR-based IV, 无GR不能IV?
  2. java rt maven_java – Maven无法使用rt.jar进行编译
  3. C# 使用new 关键字显式隐藏从基类继承的成员和内部类的使用
  4. 【面试测试题】贪婪是好事
  5. 买了又扔 戴尔放弃vworkspace虚拟桌面
  6. Python两个版本共存时,命令行升级pip
  7. SQL ORDER BY 两个列
  8. 闲鱼前端基于serverless的一种多端开发解决方案
  9. linux中执行历史第五个命令,Linux 快速执行历史命令,用 !编号
  10. 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)...
  11. opendir是安全重入函数吗_redis实现分布式锁,与jdk可重入锁ReentrantLock的原理对比剖析...
  12. 传输层协议(7):滑动窗口(1)
  13. Use Jet OLE DB Provider 4.0 to Connect to ISAM Databases (连接Excel, Text等数据库)
  14. 单链表反转--Java实现
  15. ubuntu16.04解压cudnn文件时报错,could not create a hard link file://xxx/cuda/lib64/libcudnn_static.a不完全解决方案
  16. 物联网关键技术————传感器技术
  17. jave wed 2
  18. 朋友圈加粗字体数字_报名 | 零基础入门brush lettering英文花式字体
  19. android entries属性,ListPreference需要设置两个属性:android:entries和android:entryValues...
  20. Macos 安装MacTex SublimeText3 Skim环境

热门文章

  1. 如何找到可靠的软件开发公司
  2. 京东第八批C/C++笔试题10.15第二题答案
  3. 虚拟机克隆如何调整计算机名,VMware虚拟机克隆的方法
  4. 信息学奥赛一本通1258:【例9.2】数字金字塔题解
  5. 让复选框实现单选功能
  6. 常用的maven命令如下
  7. 【opencv】高频低频滤波
  8. JavaScript中的对象,如何创建对象,创建对象的7种模式
  9. 变频电源是否要加功率补偿器?为什么?
  10. jquery 编码解码