现在,越来越多的App里面使用了模糊效果,一些背景图片会根据手指上下移动的距离来进行不同程度的模糊,感觉甚为惊奇,毕竟大家都知道,在Android平台上进行模糊渲染是一个相当耗CPU也相当耗时的操作,一旦处理不好,卡顿是在所难免的。虽然我并不知道雅虎天气是怎么做出这种效果的,但是简单的模仿一下的话,还是能做到的。

一般来说,考虑到效率,渲染一张图片最好的方法是使用OpenGL,其次是使用C/C++,使用Java代码是最慢的。但是Android推出RenderScript之后,我们就有了新的选择,测试表明,使用RenderScript的渲染效率和使用C/C++不相上下,但是使用RenderScript却比使用JNI简单地多!同时,Android团队提供了RenderScript的支持库,使得在低版本的Android平台上也能使用。

不过在使用RenderScript之前,对于模糊一张图片,需要注意的是,我们应该尽量不要使用原尺寸分辨率的图片,最好将图片缩小比例,这小渲染的效率要高一些。

动态模糊的实现

如何使用RenderScript来模糊一张图片呢?废话不多说,先上核心代码:

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 rs = RenderScript.create(context);ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);blurScript.setRadius(BLUR_RADIUS);blurScript.setInput(tmpIn);blurScript.forEach(tmpOut);tmpOut.copyTo(outputBitmap);return outputBitmap;}
}

完成上面的代码后,需要在app的gradle文件中添加如下的支持:

defaultConfig {......renderscriptTargetApi 19renderscriptSupportModeEnabled true
}


将图片模糊后,接下来要考虑的是怎么实现动态模糊效,有一点需要注意的是,即使我们使用了RenderScript这种高效的渲染方式,但是在实际测试中,渲染一张500*700分辨率的PNG格式图片,在我的Pro 6手机上,仍然需要50ms左右的时间(渲染最大模糊度的情况下),显然如果使用上面的代码进行实时渲染的话,会造成界面严重的卡顿。

既然实时渲染这条路走不通,那么就需要我们另辟蹊径了,我这里可以提供一种方法:先将图片进行最大程度的模糊处理,再将原图放置在模糊后的图片上面,通过不断改变原图的透明度(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();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);mTempBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.child);mFinalBitmap = BlurBitmap.blur(this, mTempBitmap);mBluredImage.setImageBitmap(mFinalBitmap);mOriginImg.setImageBitmap(mTempBitmap);}/*** 处理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布局如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.mzxy.mtxx.imageblurdemo.MainActivity"><ImageView
        android:id="@+id/activity_main_blured_img"android:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/child" /><ImageView
        android:id="@+id/activity_main_origin_img"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayout
        android:layout_width="match_parent"android:layout_height="80dp"android:orientation="vertical" /><SeekBar
        android:id="@+id/activity_main_seekbar"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextView
        android:id="@+id/activity_main_progress_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="0"android:textSize="24sp" /></RelativeLayout>

最终效果:

哈哈,是不是感觉很好用很神奇!

特别声明:此文章转自http://blog.csdn.net/wl9739/article/details/51955598,感谢博主“湫水”的指引!

动态实现图片模糊效果相关推荐

  1. Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片...

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

  2. 【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

  3. vue-preview动态获取图片宽高并增加旋转功能

    vue-preview是一个常用的图片查看器,微博网页版就是用的这个插件: 我在项目中也用过这个插件,总体来说,还是比较满意.但是缺少一个图片旋转功能. 安装使用 第一步:安装 npm i vue-p ...

  4. iOS开发之实现毛玻璃效果及图片模糊效果

    毛玻璃效果的实现 App设计时往往会用到一些模糊效果或者毛玻璃效果,iOS目前已提供了一些模糊API可以让我们方便使用.苹果在iOS7.0之后,很多系统界面都使用了毛玻璃效果,增加了界面的美观性,比如 ...

  5. jQuery动态改变图片显示大小(修改)

    当我们要显示后台传过来若干个尺寸不一的图片时,为了保证图片大小的一致性及比例的协调,需要动态改变图片显示尺寸.通过搜索,我们可以从网上找到实现此功能的jQuery代码如下.这段代码可以使图片的大小保持 ...

  6. WP8.1开发中关于如何显示.gif格式动态格式图片方法

    这几天又遇到个问题,就是如何显示动态图片,本来以为和显示静态图片一样,谁知不行,在网上一查才知道WP8.1不支持.gif格式动态图片的显示: 后来又在MSDN论坛上查找,也有人问类似的问题,后来就大概 ...

  7. jquery动态改变图片

    动态改变图片: var bb = 1; var aa=4; $("div[page='" + bb + "'] dd").eq(aa).children(&qu ...

  8. WPF 动态更换图片路径

    wpf中动态修改图片路径,其实很简单,有个小伙伴有疑问,绑定了source,为什么不能显示图片呢... 通过绑定,修改图片路径,动态显示图片,效果如下: 图片支持本地路径和网络路径,下面就来看看如何做 ...

  9. android 微信分享gif图,android后台动态创建图片并实现微信分享

    今天就记录一下. 先说明一下,之前没有做过类似的东西,百度了一两天才知道,说来很惭愧.有点笨,只能这样说. 在我的脑里只明白,如果要动态创建图片: 一.就是new 嘛 二.就是LayoutInflat ...

最新文章

  1. ArcGIS 复制要素
  2. Oracle 11g 新特性 -- 自动诊断资料档案库(ADR) 说明
  3. Linux命令大全(文件管理)
  4. 面试官:了解二叉树吗,平衡二叉树,红黑树?
  5. 【Gamma】Scrum Meeting 6
  6. 联想笔记本关闭锁定计算机,联想笔记本电脑键盘锁了怎么解开
  7. 3.2-点云配准原理概述
  8. var模型可以用spss做吗_求:如何用SPSS做VAR模型?
  9. AI虚拟偶像正崛起,是否可以取代你的idol?
  10. 数据结构之二叉平衡树
  11. Guessing Game
  12. 管理员技术(二): 访问练习用虚拟机、 命令行基础技巧 、 挂载并访问光盘设备、ls列表及文档创建、复制删除移动...
  13. 你的广告语,为什么用户记不住?
  14. iOS开发:音乐播放器
  15. springboot大学生拼车管理系统毕业设计源码201507
  16. Java高级开发0-1项目实战-青鸟商城-Day04
  17. 联想服务器应用场景,联想服务器承载沈阳地铁三大核心应用
  18. Typora中如何插入数学公式
  19. C++:实现量化BlackDelta测试实例
  20. js模拟钢琴演奏代码js特效

热门文章

  1. 【笔记】JAVAEE笔记
  2. 計算機程序設計:7大編程原則
  3. 【vue】v-for循环样式乱
  4. 16.第六章 非参数假设检验(2)
  5. 如何彻底禁止 macOS Catalina 自动更新,去除更新标记和通知
  6. OpenCV C++案例实战二十一《制作视频播放器》
  7. matlab编程是用c语言吗,matlab调用c语言编程.doc
  8. Python 漏斗图分析 之 MOOC商业数据分析作业
  9. 关于使用工具包,应用程序中发生了无法处理的异常。如果单击“继续”,应用程序忽略错误尝试继续运行。点击退出,应用程序将会“关闭”。异常来自HRESULT:0x80040228的错误问题!
  10. 利用map()函数,把用户输入的不规则的英文名字,变为首字母大写,其他小写。