返回顶部
首页 > 资讯 > 精选 >如何在Android中使用RenderScript实现一个毛玻璃模糊效果
  • 534
分享到

如何在Android中使用RenderScript实现一个毛玻璃模糊效果

androidrenderscripters 2023-05-31 10:05:02 534人浏览 八月长安
摘要

今天就跟大家聊聊有关如何在Android中使用RenderScript实现一个毛玻璃模糊效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。RenderScript 介绍在开始之前,先

今天就跟大家聊聊有关如何在Android中使用RenderScript实现一个毛玻璃模糊效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

RenderScript 介绍

在开始之前,先看下 RenderScript 的官方介绍:

RenderScript is a framework for running computationally intensive tasks at high perfORMance on Android. RenderScript is primarily oriented for use with data-parallel computation, although serial workloads can benefit as well. The RenderScript runtime parallelizes work across processors available on a device, such as multi-core CPUs and GPUs. This allows you to focus on expressing alGorithms rather than scheduling work. RenderScript is especially useful for applications performing image processing, computational photography, or computer vision.

大致意思就是说 RenderScript 是 Android 平台上为了计算密集型任务的一中高性能框架,并且RenderScript 尤其对图像的处理特别有用。另外,RenderScript 之所以效率高是因为其底层是 C 实现的。

使用 RenderScript Support Library

为了可以兼容到更早的版本,我们直接使用 android.support.v8.renderscript(支持api level 9+)包下的,而不使用android.renderscript(支持API level 11+)

以 Android Studio 为例,打开你的 app 的 build.gradle 文件,在 android 的 defaultConfig 结点添加两句:

renderscriptTargetApi 18renderscriptSupportModeEnabled true

其中 renderscriptTargetApi 的值官方说的是从 11 到最新的 API Level 都可以

这样我们等下导包就可以导 v8 内的了。

模糊背景

局部模糊

先上一张我们要实现的效果图:

如何在Android中使用RenderScript实现一个毛玻璃模糊效果

这里可以看到实现的是局部模糊,在图片的正中间有一个 TextView,TextView 的背景部分做了模糊处理。

先大致说下模糊的主要步骤(完全模糊步骤一样):

  1. 首先取出 TextView 在 ImageView 正上方处的那一块背景

  2. 然后对取出的那一块背景做模糊处理

  3. 最后把模糊处理后的背景再设为 TextView 的背景

这样,就可以达到我们图片中的局部模糊效果,具体的过程在代码中有详细的注释。

下面先贴上布局文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="Http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="20dp"> <FrameLayout  android:layout_width="300dp"  android:layout_height="300dp"  android:layout_centerInParent="true">  <ImageView   android:id="@+id/image"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:scaleType="centerCrop"   android:src="@drawable/img"/>  <TextView   android:id="@+id/text"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_gravity="center"   android:text="Melody"   android:textColor="@android:color/white"   android:textSize="45sp"/> </FrameLayout></RelativeLayout>

再贴上java代码:

public class MainActivity extends Activity implements Runnable { private static final String TAG = "MainActivity"; private ImageView mImage; private TextView mText; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  mImage = (ImageView) findViewById(R.id.image);  mText = (TextView) findViewById(R.id.text);  // onCreate()内无法到ImageView的背景,所以需要 post 到消息队列内稍后执行  mImage.post(this); } @Override public void run() {  blur(getImageViewBitmap(mImage), mText); }  public Bitmap getImageViewBitmap(ImageView imageView) {  imageView.setDrawinGCacheEnabled(true);  // 取出ImageView的Bitmap  Bitmap bitmap = imageView.getDrawingCache();  // 拷贝一份bitmap用作模糊  Bitmap bitmapCopy = bitmap.copy(bitmap.getConfig(), true);  imageView.setDrawingCacheEnabled(false);  return bitmapCopy; }  public void blur(Bitmap inputBitmap, View targetView) {  // 创建一个和目标View(需要背景被模糊的View)宽高一样的空的 outputBitmap  Bitmap outputBitmap = Bitmap.createBitmap((int) (targetView.getMeasuredWidth()),    (int) (targetView.getMeasuredHeight()), Bitmap.Config.ARGB_8888);  // 将 outputBitmap 关联在 canvas 上  Canvas canvas = new Canvas(outputBitmap);  // 画布移动到目标 View 在父布局中的位置  canvas.translate(-targetView.getLeft(), -targetView.getTop());  Paint paint = new Paint();  paint.setFlags(Paint.FILTER_BITMAP_FLAG);  // 将要模糊的 inputBitmap 绘制到 outputBitmap 上  // 因为刚才做了 translate 操作,这样就可以裁剪到目标 View 在父布局内的那一块背景到 outputBitmap 上  canvas.drawBitmap(inputBitmap, 0, 0, paint);  // ----接下来做模糊 outputBitmap 处理操作----  // 创建 RenderScript  RenderScript rs = RenderScript.create(this);  Allocation input = Allocation.createFromBitmap(rs, outputBitmap);  Allocation output = Allocation.createTyped(rs, input.getType());  // 使用 ScriptIntrinsicBlur 类来模糊图片  ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(    rs, Element.U8_4(rs));  // 设置模糊半径 ( 取值范围为( 0.0f , 25f ] ,半径越大,模糊效果也越大)  blur.setRadius(25f);  blur.setInput(input);  // 模糊计算  blur.forEach(output);  // 模糊 outputBitmap  output.copyTo(outputBitmap);  // 将模糊后的 outputBitmap 设为目标 View 的背景  targetView.setBackground(new BitmapDrawable(getResources(), outputBitmap));  rs.destroy(); }}

导的是 v8 的包:

import android.support.v8.renderscript.Allocation;import android.support.v8.renderscript.Element;import android.support.v8.renderscript.RenderScript;import android.support.v8.renderscript.ScriptIntrinsicBlur;

完全模糊

上面是局部模糊,然后我们改变一下 TextView 的宽高铺满父布局,使其和 ImageView 大小一样来实现完全模糊效果:

...<TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="Melody" android:textColor="@android:color/white" android:textSize="45sp"/>...

java代码部分不需要改变,下面再看效果图:

效率如何?

为了查看操作耗时,我使用 Log 在 blur() 方法的开头和结束地方分别计算了时间,然后查看时间差:

10-09 17:04:23.664 23665-23665/com.melodyxxx.blurdemo2 E/MainActivity: spend: 120ms

可以看到居然花了 120ms,显然效率不够高,有没有优化的方法?(测试机型为 魅族 PRO 6)

效率优化

上面的是直接将原 ImageView 的 bitmap 直接模糊处理,效率不够高,所以我们可以先将原图片进行压缩处理,然后在进行模糊,下面为关键代码,scaleFactor 为压缩比例大小,例如 scaleFactor 为 2,代表先将原图压缩为原来的 1/2,然后进行模糊,效率会高很多。

...Bitmap outputBitmap = Bitmap.createBitmap((int) (mTargetView.getMeasuredWidth() / scaleFactor),  (int) (mTargetView.getMeasuredHeight() / scaleFactor), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(outputBitmap);canvas.translate(-mTargetView.getLeft() / scaleFactor, -mTargetView.getTop() / scaleFactor);canvas.scale(1 / scaleFactor, 1 / scaleFactor);Paint paint = new Paint();paint.setFlags(Paint.FILTER_BITMAP_FLAG);canvas.drawBitmap(mInputBitmap, 0, 0, paint);...

下面是 Demo 效果图:

如何在Android中使用RenderScript实现一个毛玻璃模糊效果

结果:

压缩比例为 2 时:耗时 19 ms

压缩比例为 8 时:耗时 2 ms

根据压缩比例配合不同的模糊半径可以达到不同模糊效果。

再来看 Demo 效果图中拖动 SeekBar 可以动态的实现模糊效果,首先想到的方法是每次拖动时实时计算模糊,这样的效率肯定不行,还会造成卡顿,我这里的方法是先将图片最大化模糊一次设给上方 ImageView 的背景即可,然后 SeekBar 拖动时,只需要改变最上方或者下方图片的透明度就可以达到上面的效果。

看完上述内容,你们对如何在Android中使用RenderScript实现一个毛玻璃模糊效果有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: 如何在Android中使用RenderScript实现一个毛玻璃模糊效果

本文链接: https://lsjlt.com/news/224799.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在Android中使用RenderScript实现一个毛玻璃模糊效果
    今天就跟大家聊聊有关如何在Android中使用RenderScript实现一个毛玻璃模糊效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。RenderScript 介绍在开始之前,先...
    99+
    2023-05-31
    android renderscript ers
  • Android模糊处理实现图片毛玻璃效果
    本文实例讲解了Android 虚化图片、模糊图片、图片毛玻璃效果的实现方法,具体内容如下 效果如图: 在Android可以用RenderScript方便的实现这个方法: ...
    99+
    2022-06-06
    图片 毛玻璃 Android
  • Android模糊处理简单实现毛玻璃效果
    自从iOS系统引入了Blur效果,也就是所谓的毛玻璃、模糊化效果、磨砂效果,各大系统就开始竞相模仿,这是怎样的一个效果呢,我们先来看一下,如下面的图片: 实现效果大家都知道了,...
    99+
    2022-06-06
    毛玻璃 Android
  • 怎么用CSS3实现毛玻璃模糊效果
    这篇文章主要介绍“怎么用CSS3实现毛玻璃模糊效果”,在日常操作中,相信很多人在怎么用CSS3实现毛玻璃模糊效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用CSS3实...
    99+
    2024-04-02
  • CSS3如何实现毛玻璃效果
    这篇文章主要介绍“CSS3如何实现毛玻璃效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CSS3如何实现毛玻璃效果”文章能帮助大家解决问题。代码如下:body {  ...
    99+
    2023-07-05
  • Android 实现图片模糊、高斯模糊、毛玻璃效果的三种方法
    在前几天写过一个使用glide-transformations的方法实现高斯模糊的方法,今天偶然间有发现一个大神写的另一个方法,感觉挺不错的,分享一下: 效果图: 原文链接:...
    99+
    2022-06-06
    方法 图片 高斯 高斯模糊 毛玻璃 Android
  • Android开发中怎么实现一个iOS中的毛玻璃效果
    本篇文章为大家展示了Android开发中怎么实现一个iOS中的毛玻璃效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现代码:<html><head> <meta h...
    99+
    2023-05-31
    android ios roi
  • Android中怎么实现毛玻璃背景效果
    这篇文章给大家介绍Android中怎么实现毛玻璃背景效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。思路:     1.使用findViewByid获得需要设置毛玻璃的控件。&...
    99+
    2023-05-30
    android
  • 如何使用CSS实现毛玻璃特效
    这篇文章主要介绍“如何使用CSS实现毛玻璃特效”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用CSS实现毛玻璃特效”文章能帮助大家解决问题。一、backdrop-filter 是金手指吗?毛玻...
    99+
    2023-06-29
  • 如何使用纯CSS实现底层毛玻璃效果
    这篇“如何使用纯CSS实现底层毛玻璃效果”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“如何使用纯CSS实现底层毛玻璃效果”,小编整理了以下知识点,请大家跟着小...
    99+
    2024-04-02
  • Android中实现毛玻璃效果的3种方法
    最近在做一款叫叽叽的App(男银懂的),其中有一个功能需要对图片处理实现毛玻璃的特效 进过一番预研,找到了3中实现方案,其中各有优缺点: 1、如果系统的api在16以上,可以使...
    99+
    2022-06-06
    方法 毛玻璃 Android
  • 如何实现C++语言中的毛玻璃效果
    今天就跟大家聊聊有关如何实现C++语言中的毛玻璃效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在基于Windows Vista的普通Windows应用程序及对话框程序中,如何利用...
    99+
    2023-06-17
  • 在Android开发中利用RenderScript实现一个动态高斯模糊效果
    在Android开发中利用RenderScript实现一个动态高斯模糊效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是RenderScriptRenderScript是...
    99+
    2023-05-31
    android renderscript ers
  • 如何利用CSS如何实现全兼容的毛玻璃效果
    这篇文章主要讲解了“如何利用CSS如何实现全兼容的毛玻璃效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何利用CSS如何实现全兼容的毛玻璃效果”吧!通过...
    99+
    2024-04-02
  • 如何使用html5 canvas实现图片玻璃碎片特效
    小编给大家分享一下如何使用html5 canvas实现图片玻璃碎片特效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • Android12窗口模糊(一)在Activity和Dialog中实现高斯模糊效果
    前言 在 Android 12 中,提供了一些用于实现窗口模糊处理效果(例如背景模糊处理和模糊处理后方屏幕)的公共 API。窗口模糊处理或跨窗口模糊处理用于模糊处理给定窗口后方的屏幕。 有两种窗口模糊处理方式,可用于实现不同的视觉效果: ...
    99+
    2023-08-30
    Frameworks Android
  • 如何在Android中利用ConstraintLayout实现一个动画效果
    这篇文章将为大家详细讲解有关如何在Android中利用ConstraintLayout实现一个动画效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。xml布局:<!-- activit...
    99+
    2023-05-31
    android constraintlayout roi
  • 如何在Android应用中实现一个Gallery画廊效果
    这期内容当中小编将会给大家带来有关如何在Android应用中实现一个Gallery画廊效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。画廊 使用Gallery表示,按水平方向显示内容,并且可以用手指直接...
    99+
    2023-05-31
    android gallery roi
  • 在Android中使用TextView实现一个跑马灯效果
    本篇文章为大家展示了在Android中使用TextView实现一个跑马灯效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 条件:android:ellipsize=”marquee”Te...
    99+
    2023-05-31
    textview android roi
  • 如何在Android界面中实现一个回弹效果
    这篇文章给大家介绍如何在Android界面中实现一个回弹效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体代码如下所示:public class MyScrollView extends ScrollView { ...
    99+
    2023-05-31
    android roi %d
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作