Android动态模糊效果的快速实现方法

发布时间 - 2026-01-10 22:42:24    点击率:

写在前面

现在,越来越多的App里面使用了模糊效果,这种模糊效果称之为高斯模糊。大家都知道,在Android平台上进行模糊渲染是一个相当耗CPU也相当耗时的操作,一旦处理不好,卡顿是在所难免的。一般来说,考虑到效率,渲染一张图片最好的方法是使用OpenGL,其次是使用C++/C,使用Java代码是效率是最低,速度也是最慢的。但是Android推出RenderScript之后,我们就有了选择,测试表明,使用RederScript的渲染效率和使用C++/C不相上下,但是使用RenderScript却比使用JNI简单得多!同时,Android团队提供了RenderScript的支持库,使得在低版本的Android平台上也能使用。
不过在使用RenderScript之前,对于模糊一张图片,需要注意的是,我们应该尽量不要使用原尺寸分辨率的图片,最好将图片缩小比例,这小渲染的效率要高一些,速度也更快一些。

什么是RenderScript

RenderScript是一种低级的高性能编程语言,用于3D渲染和处理密集型计算(3D播放等和关于CPU密集型的计算)。一直以来Android 在绘图性能的表现一直差强人意,引入NDK之后才有所改善,而在Honeycomb 中发布了RenderScript 这一杀手级在Framework 后,大大的增加了Android本地语言的执行能力和计算能力。现在网上介绍RenderScript的文章非常少,附上一篇博客,大家可以能更好理解这门语言。

关于Android RenderScript 的详细说明和一些实用文档

如果需要详细了解,可以查看官方文档RenderScript

动态模糊的实现
使用之前,先要在Module build.gradle里面作下面的定义:

MainActivity.java

package com.jackie.blurimage; 
 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.ImageView; 
import android.widget.SeekBar; 
import android.widget.TextView; 
 
public class MainActivity extends AppCompatActivity { 
  private ImageView mBlurImage, mOriginImage; 
  private SeekBar mSeekBar; 
  private TextView mSeekProgress; 
 
  private int mAlpha; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
 
    initView(); 
    initData(); 
    initEvent(); 
  } 
 
  private void initView() { 
    mBlurImage = (ImageView) findViewById(R.id.blur_image); 
    mOriginImage = (ImageView) findViewById(R.id.origin_image); 
    mSeekBar = (SeekBar) findViewById(R.id.seek_bar); 
    mSeekProgress = (TextView) findViewById(R.id.seek_progress); 
  } 
 
  private void initData() { 
    // 获取图片 
    Bitmap originBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.blur); 
    Bitmap blurBitmap = BlurUtils.blur(this, originBitmap); 
 
    // 填充模糊后的图像和原图 
    mBlurImage.setImageBitmap(blurBitmap); 
    mOriginImage.setImageBitmap(originBitmap); 
  } 
 
  private void initEvent() { 
    mSeekBar.setMax(100); 
 
    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
        mAlpha = progress; 
 
        mOriginImage.setAlpha((int) (255 - mAlpha * 2.55)); 
        mSeekProgress.setText(String.valueOf(mAlpha)); 
      } 
 
      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
 
      } 
 
      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
 
      } 
    }); 
  } 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:orientation="vertical"> 
 
  <FrameLayout 
    android:layout_width="match_parent" 
    android:layout_weight="1" 
    android:layout_height="0dp"> 
 
    <ImageView 
      android:id="@+id/blur_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop" 
      android:src="@drawable/blur"/> 
 
    <ImageView 
      android:id="@+id/origin_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop"/> 
  </FrameLayout> 
 
  <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="80dp" 
    android:orientation="vertical"> 
 
    <SeekBar 
      android:id="@+id/seek_bar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="16dp" 
      android:layout_marginRight="16dp" 
      android:layout_marginTop="@dimen/activity_vertical_margin"/> 
 
    <TextView 
      android:id="@+id/seek_progress" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="0" 
      android:textSize="24sp"/> 
  </LinearLayout> 
</LinearLayout> 

从上面的代码可以看出,在FrameLayout上放了两张图片,然后动态更改图片的透明度来达到动态模糊效果。
BlurUtils.java

package com.jackie.blurimage; 
 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.renderscript.Allocation; 
import android.renderscript.Element; 
import android.renderscript.RenderScript; 
import android.renderscript.ScriptIntrinsicBlur; 
 
/** 
 * Created by Jackie on 2017/1/21. 
 * 高斯模糊工具类 
 */ 
 
public class BlurUtils { 
  /** 
   * 图片缩放比例 
   */ 
  private static final float SCALE_DEGREE = 0.4f; 
  /** 
   * 最大模糊度(在0.0到25.0之间) 
   */ 
  private static final float BLUR_RADIUS = 25f; 
 
  /** 
   * 模糊图片 
   * @param context  上下文 
   * @param bitmap  需要模糊的图片 
   * @return     模糊处理后的图片 
   */ 
  public static Bitmap blur(Context context,Bitmap bitmap) { 
    //计算图片缩小的长宽 
    int width = Math.round(bitmap.getWidth() * SCALE_DEGREE); 
    int height = Math.round(bitmap.getHeight() * SCALE_DEGREE); 
 
    //将缩小后的图片作为预渲染的图片 
    Bitmap inputBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false); 
    //创建一张渲染后的输入图片 
    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); 
 
    //创建RenderScript内核对象 
    RenderScript renderScript = RenderScript.create(context); 
    //创建一个模糊效果的RenderScript的工具对象 
    ScriptIntrinsicBlur scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); 
 
    /** 
     * 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间。 
     * 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去。 
     */ 
    Allocation inputAllocation = Allocation.createFromBitmap(renderScript, inputBitmap); 
    Allocation outputAllocation = Allocation.createFromBitmap(renderScript, outputBitmap); 
 
    //设置渲染的模糊程度,25f是最大模糊度 
    scriptIntrinsicBlur.setRadius(BLUR_RADIUS); 
    //设置ScriptIntrinsicBlur对象的输入内存 
    scriptIntrinsicBlur.setInput(inputAllocation); 
    //将ScriptIntrinsicBlur输出数据保存到输出内存中 
    scriptIntrinsicBlur.forEach(outputAllocation); 
 
    //将数据填充到Allocation中 
    outputAllocation.copyTo(outputBitmap); 
 
    return outputBitmap; 
  } 
} 

效果图如下,妹纸一枚!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # 动态模糊  # Android 动态高斯模糊效果教程  # 教你快速实现Android动态模糊效果  # Android实现动态高斯模糊效果  # Android图片特效:黑白特效、圆角效果、高斯模糊  # Android中实现布局背景模糊化处理的方法  # Android模糊处理实现图片毛玻璃效果  # Android模糊处理简单实现毛玻璃效果  # Android关于Glide的使用(高斯模糊、加载监听、圆角图片)  # Android调用系统拍照裁剪图片模糊的解决方法  # Android 实现图片模糊、高斯模糊、毛玻璃效果的三种方法  # 高斯  # 的是  # 是一个  # 这一  # 文档  # 是一种  # 最好的  # 大家都  # 也能  # 平台上  # 而在  # 要在  # 差强人意  # 得多  # 才有  # 不相上下  # 详细说明  # 考虑到  # 在所难免  # 更快 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 手机网站制作与建设方案,手机网站如何建设?  如何挑选最适合建站的高性能VPS主机?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  高防服务器:AI智能防御DDoS攻击与数据安全保障  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何在阿里云香港服务器快速搭建网站?  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  深圳网站制作的公司有哪些,dido官方网站?  Linux安全能力提升路径_长期防护思维说明【指导】  EditPlus中的正则表达式 实战(4)  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  浅析上传头像示例及其注意事项  如何在局域网内绑定自建网站域名?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  js代码实现下拉菜单【推荐】  javascript中闭包概念与用法深入理解  焦点电影公司作品,电影焦点结局是什么?  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  香港服务器部署网站为何提示未备案?  Bootstrap整体框架之JavaScript插件架构  Laravel怎么上传文件_Laravel图片上传及存储配置  大同网页,大同瑞慈医院官网?  如何快速重置建站主机并恢复默认配置?  如何用PHP工具快速搭建高效网站?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  原生JS实现图片轮播切换效果  教你用AI将一段旋律扩展成一首完整的曲子  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Laravel如何实现API版本控制_Laravel版本化API设计方案  千库网官网入口推荐 千库网设计创意平台入口  如何快速打造个性化非模板自助建站?  如何在香港免费服务器上快速搭建网站?  北京网站制作公司哪家好一点,北京租房网站有哪些?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何在建站之星网店版论坛获取技术支持?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  如何在新浪SAE免费搭建个人博客?  jQuery中的100个技巧汇总  如何获取PHP WAP自助建站系统源码?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  网站制作企业,网站的banner和导航栏是指什么?  如何在阿里云通过域名搭建网站?  如何续费美橙建站之星域名及服务?  教学论文网站制作软件有哪些,写论文用什么软件 ?