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

Android动态模糊效果的快速实现方法,第1张

概述写在前面现在,越来越多的App里面使用了模糊效果,这种模糊效果称之为高斯模糊。大家都知道,在Android平台上进行模糊渲染是一个相当耗CPU也相当耗时的 *** 作,一旦处理不好,卡顿是在所难免的。一般来说,考虑到效率

写在前面

现在,越来越多的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动态模糊效果的快速实现方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147139.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存