图片 6

Android实现动态高斯模糊效果

写在后面

近年直接在做毕设项指标准备干活,考虑到恐怕要用到四个歪曲的效率,所以就学习了一部分高斯模糊效果的兑现。比较显赫的正是 FastBlur 以至它衍生的一对优化方案,还应该有正是后天要说的RenderScript 。

因为那东西是今后需求才去学习的,所以关于部分图像管理和渲染难题就不提了。但是在动用的历程中真的能心获得,即使不一样的方案都能实现平等的混淆效果,不过功能差距真的一点都不小。

本篇文章落成的高斯模糊是基于上面这篇小说学习的,先引入一下。本文内容与其内容差不离,只是有个别讲的事必躬亲一点,并更正了代码中部分实现逻辑和细节上的管理。可是主体内容不改变,所以选取哪篇小说去学都以同一的。

上面就来看一下,怎么着去达成如此的高斯模糊效果。

图片 1

高斯模糊是怎样?

简单聊聊 Renderscript

因为效果与利益的兑现是基于 Renderscript 的,所以有供给先来打听一下。

从它的官方文档来看,说的非常微妙。我们只必要知道一点就好了:

RenderScript is a framework for running computationally intensive
tasks at high performance on Android.

Renderscript 是 Android 平台上进展高品质计算的框架。

既然是高质量总结,那么表明 RenderScript 对图像的管理特别有力,所以用它来促成高斯模糊依然相比好的挑选。

那么哪些选用它呢?从官方文档中能够看出,假如须求在 Java 代码中采纳 Renderscript 的话,就务须依赖 android.renderscript 或者android.support.v8.renderscript 中的 API 。既然有 API 那就好办多了。

上面简单说一下采纳的步骤,那也是官方文档中的表明:

  • 先是须求经过 Context 创立叁个 Renderscript ;
  • 其次通过创办的 Renderscript 来创设一个团结索要的本子( ScriptIntrinsic 卡塔尔国,譬如这里供给模糊,这正是 ScriptIntrinsicBlur ;
  • 接下来起码成立二个 Allocation 类来创建、分配内存空间;
  • 接着便是对图像举香港行政局部甩卖,例如说模糊管理;
  • 拍卖完了后,需求刚才的 Allocation 类来填丰富配好的内部存款和储蓄器空间;
  • 终极还行性的对一些财富拓宽回收。

文书档案中的解释永恒很诚实,相比难懂,大家构成原博主 湫水长天 的代码来看一看步骤:

/**
 * @author Qiushui
 * @description 模糊图片工具类
 * @revision Xiarui 16.09.05
 */
public class BlurBitmapUtil {
    //图片缩放比例
    private static final float BITMAP_SCALE = 0.4f;

    /**
     * 模糊图片的具体方法
     *
     * @param context 上下文对象
     * @param image   需要模糊的图片
     * @return 模糊处理后的图片
     */
    public static Bitmap blurBitmap(Context context, Bitmap image,float blurRadius) {
        // 计算图片缩小后的长宽
        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(blurRadius);
        // 设置blurScript对象的输入内存
        blurScript.setInput(tmpIn);
        // 将输出数据保存到输出内存中
        blurScript.forEach(tmpOut);

        // 将数据填充到Allocation中
        tmpOut.copyTo(outputBitmap);

        return outputBitmap;
    }
}

下边就是处理高斯模糊的代码,当中注释写的百般详实,而且已经将图纸缩放管理了弹指间。结合刚刚说的步子,大家应该能有几个大意的记念,实在不懂也没涉及,这是二个工具类,直接Copy 过来就可以。

自然,原博主将代码封装成轮子了,也能够直接在档次中援引 Gradle 也是能够的,可是自个儿认为源码依旧要看一看的。

高斯模糊(土耳其共和国语:Gaussian Blur),也叫高斯平滑,是在Adobe
Photoshop、GIMP以致Paint.NET等图像管理软件中广泛使用的拍卖效果,通常用它来压缩图像噪声以致减弱细节档案的次序。这种歪曲技能生成的图像,其视觉效果就好像经过三个半透明荧屏在察看图像,那与画面焦外成像效果散景以至习以为常照明阴影中的效果都鲜明差别。

粗略的歪曲

好了,有了三个差不离的回忆后,来看一下怎么落实高斯模糊效果呢!

率先你可以在品种中央直属机关接援引原博主封装的车轮:

compile 'com.qiushui:blurredview:0.8.1'

只要不想援引的话,就务须在当下 Module 的 build.gradle 中增多如下代码:

defaultConfig {
    renderscriptTargetApi 19
    renderscriptSupportModeEnabled true
}

等构建好就能够使用了。如若创设退步以来,只必要把 minSdkVersion 设置成 19 就好了,一时不知是何原因。可是从 StackOverflow 中领会到那是个Bug ,那就不用查究。

前些天来看代码达成,首先构造文件中就三个 ImageView
,没啥好说的,从下面的模糊图片工具类能够看看,要想获取贰个高斯模糊效果的图片,须求三样东西:

  • Context:上下文对象
  • Bitmap:须求模糊的图形
  • BlurRadius:模糊程度

那边供给留意一下:

时下这种方案只适用于 PNG
格式的图样,並且图片大小最棒小一些,即便代码中早就缩放了图片,但照样或许会并发卡顿的动静。

近期一经设置一下图片和模糊程度就好了:

/**
 * 初始化View
 */
@SuppressWarnings("deprecation")
private void initView() {
    basicImage = (ImageView) findViewById(R.id.iv_basic_pic);
    //拿到初始图
    Bitmap initBitmap = BitmapUtil.drawableToBitmap(getResources().getDrawable(R.raw.pic));
    //处理得到模糊效果的图
    Bitmap blurBitmap = BlurBitmapUtil.blurBitmap(this, initBitmap, 20f);
    basicImage.setImageBitmap(blurBitmap);
}

来看一下运营图:

图片 2

可以观察,图片已经落到实处了歪曲效果,并且速度还蛮快的,简来讲之通过 BlurBitmapUtil.blurBitmap()就能够博得一张模糊效果的图

怎么样?看不晓得?不妨,小编也看不精通,维基百科复制回来的呗。大家直接放一些图纸来领悟以下这么些高斯模糊是怎样的。因为高斯模糊在iOS中最普及,这里抓了几张iOS新浪云的图样:

自定义模糊控件

原博主的车轱辘里给大家封装了一个自定义的 BlurredView ,刚起头自个儿认为没供给自定义。后来发觉自定义的案由是索要实现动态模糊效果。

那干什么无法手动去设置模糊程度吗?他付出的演说是:

“借使运用方面包车型客车代码举行实时渲染的话,会产生分界面严重的卡顿。”

自己也亲身试了一试,确实有一点点卡。他落实动态模糊管理的方案是这么的:

“先将图纸实行最大程度的模糊处理,再将原图放置在模糊后的图纸上边,通过不断退换原图的反射率(Alpha值)来促成动态模糊效果。”

以此方案确实很抢眼的贯彻动态效果,但是注意如果要采取这种办法,就务须有两张同出一辙的图样。如若在代码中央机关单位接写,就须要五个控件,若是图片多以来,鲜明是不可取的。所以轮子里有三个自定义的 BlurredView 。

不过那一个 BlurredView 封装的不是太好,小编删减了一片段剧情,原因稍后再说。先来看一下主干代码。

第一是自定义的 BlurredView 继承于 RelativeLayout ,在布局文件中得以看到,里面有四个 ImageView,且是叠在合作的。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <ImageView
        android:id="@+id/blurredview_blurred_img"
        .../>

    <ImageView
        android:id="@+id/blurredview_origin_img"
        .../>

</FrameLayout>

并且也定义了一些性质:

<resources>
    <declare-styleable name="BlurredView">
        <attr name="src" format="reference"/>
        <attr name="disableBlurred" format="boolean"/>
    </declare-styleable>
</resources>

二个是设置图片,多少个是设置是还是不是禁止使用模糊。最后正是 BlurredView 类,代码如下,有恢宏剔除,只贴出核心代码:

/**
 * @author Qiushui
 * @description 自定义模糊View类
 * @revision Xiarui 16.09.05
 */
public class BlurredView extends RelativeLayout {

    /*========== 全局相关 ==========*/
    private Context mContext;//上下文对象
    private static final int ALPHA_MAX_VALUE = 255;//透明最大值
    private static final float BLUR_RADIUS = 25f;//最大模糊度(在0.0到25.0之间)

    /*========== 图片相关 ==========*/
    private ImageView mOriginImg;//原图ImageView
    private ImageView mBlurredImg;//模糊后的ImageView
    private Bitmap mBlurredBitmap;//模糊后的Bitmap
    private Bitmap mOriginBitmap;//原图Bitmap

    /*========== 属性相关 ==========*/
    private boolean isDisableBlurred;//是否禁用模糊效果

    ...

    /**
     * 以代码的方式添加待模糊的图片
     *
     * @param blurredBitmap 待模糊的图片
     */
    public void setBlurredImg(Bitmap blurredBitmap) {
        if (null != blurredBitmap) {
            mOriginBitmap = blurredBitmap;
            mBlurredBitmap = BlurBitmapUtil.blurBitmap(mContext, blurredBitmap, BLUR_RADIUS);
            setImageView();
        }
    }
    ...

    /**
     * 填充ImageView
     */
    private void setImageView() {
        mBlurredImg.setImageBitmap(mBlurredBitmap);
        mOriginImg.setImageBitmap(mOriginBitmap);
    }

    /**
     * 设置模糊程度
     *
     * @param level 模糊程度, 数值在 0~100 之间.
     */
    @SuppressWarnings("deprecation")
    public void setBlurredLevel(int level) {
        //超过模糊级别范围 直接抛异常
        if (level < 0 || level > 100) {
            throw new IllegalStateException("No validate level, the value must be 0~100");
        }

        //禁用模糊直接返回
        if (isDisableBlurred) {
            return;
        }

        //设置透明度
        mOriginImg.setAlpha((int) (ALPHA_MAX_VALUE - level * 2.55));
    }

    ...
}

从代码中得以看看,最中央的正是上边多个方法:

  • setBlurredImg(Bitmap blurredBitmap卡塔尔:设置图片,并复制两份;
  • setImageView(卡塔尔国:给三个ImageView设置相应的图形,内部调用;
  • setBlurredLevel(int levelState of Qatar:设置透明程度;

思路就是先选定一张图片,一张作为原图,一张作为模糊管理过的图。再各自将这两张图设置给自定义 BlurredView 中的八个 ImageView ,最终管理模糊过后的这张图的光滑度。

好了,将来来写三个自定义的模糊效果图,首先是结构,相当粗略:

 <com.blurdemo.view.BlurredView
        android:id="@+id/bv_custom_blur"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:src="@raw/pic"
        app:disableBlurred="false" />

能够看来,设置了图片,设置了敞开模糊,那么大家在Activity中只需安装透明程度就可以:

private void initView() {
        customBView = (BlurredView) findViewById(R.id.bv_custom_blur);
        //设置模糊度
        customBView.setBlurredLevel(100);
    }

功用图与上海教室一律,这里就不重复贴了。能够看来,代码简单了无数,然而独有因为平价轻易可不是自定义 View 的成效,成效在于接下去要说的 动态模糊效果 的实现。

图片 3

动态模糊

大家先来看一下什么叫动态模糊效果:

图片 4

从图中可以见到,随着我们触动荧屏的时候,背景的混淆程度会跟着变化。借使要一贯设置其混淆视听度会及其的卡顿,所以正如原博主所说,能够用两张图纸来促成。

大概思路就是,上边的图形模糊处理,上面包车型地铁图样不管理,然后经过手势改造上边模糊图片的发光度就可以。

所以眼前边的代码大致同一,只需求重写 onTouchEvent 方法就可以:

/**
 * 初始化View
 */
private void initView() {
    customBView = (BlurredView) findViewById(R.id.bv_dynamic_blur);
    //设置初始模糊度
    initLevel = 100;
    customBView.setBlurredLevel(initLevel);
}

/**
 * 触摸事件
 */
@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            downY = ev.getY();
            break;

        case MotionEvent.ACTION_MOVE:
            float moveY = ev.getY();
            //手指滑动距离
            float offsetY = moveY - downY;
            //屏幕高度 十倍是为了看出展示效果
            int screenY = getWindowManager().getDefaultDisplay().getHeight() * 10;
            //手指滑动距离占屏幕的百分比
            movePercent = offsetY / screenY;
            currentLevel = initLevel + (int) (movePercent * 100);
            if (currentLevel < 0) {
                currentLevel = 0;
            }
            if (currentLevel > 100) {
                currentLevel = 100;
            }
            //设置模糊度
            customBView.setBlurredLevel(currentLevel);
            //更改初始模糊等级
            initLevel = currentLevel;
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return super.onTouchEvent(ev);
}

从代码中得以见到,这里是透过手指滑动间隔占荧屏的百分比来总计改换后的晶莹等第的,代码应该轻松,超级轻巧驾驭。当然原博主博客中是经过过程条来改动的,也是能够的,就不在赘述了。

能够见见这一个分界面中的背景,其实正是经过图1西路那么些小图片模糊获得的,那样做的收益正是全部性很好,而且不会因为图片过渡突兀而影响分界面内容的阅读。

与 RecylcerView 相结合

先来看一张效果图,这几个图也是模拟原博主去完成的,可是依旧某个许的不等。

图片 5

自然的自定义 BlurredView 中还会有几段代码是改过背景图的岗位的,因为希望上拉下拉的时候背景图也是足以移动的,可是从资历来看功用不是太好,上拉的历程中会现身留白的难点。

固然原博主给出了解决方案:手动给背景图扩大叁个中度,但那而不是最佳的消除方法,所以自个儿就此功效给删除了,等找到越来越好的落到实处际意况势再来补充。

现在来看哪样得以完结?首先构作育是上边一层自定义的 BlurredView ,上边二个 RecylcerViewRecylcerView 有两个 Type ,贰个是头布局,一个是底下的列表,超级粗略,就不详细说了。

要害仍然为动态模糊的贯彻,在上头的动态模糊中,大家利用了重写 onTouchEvent 方法,可是此间适逢其会是 RecylcerView ,我们可以依附它的轮转监听,也正是 onScrollListener 来达成动态改换透明度,大旨措施如下:

    //RecyclerView 滚动监听
    mainRView.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            //滚动距离
            mScrollerY += dy;
            //根据滚动距离控制模糊程度 滚动距离是模糊程度的十倍
            if (Math.abs(mScrollerY) > 1000) {
                mAlpha = 100;
            } else {
                mAlpha = Math.abs(mScrollerY) / 10;
            }
            //设置透明度等级
            recyclerBView.setBlurredLevel(mAlpha);
        }
    });

代码很简短,就是在 onScrolled 方法中总括并动态改动折射率,只要驾驭了规律,完成起来照旧超轻便的。

那么,究竟在Android上怎么去得以完成这些职能呢?这里推荐应用官方提供在Support
Library中的三个工具来做,就是RenderScript。这个RenderScript的作用实在不仅只有那叁个,而此外的局地意义,能够在合法语档中阅读学习,这里不交付。

总结

从眼下全数的动态图能够观望,运营起来依然一点也十分的快的,然而自个儿从 Android
Monitor
 中看见,在每便刚最早渲染模糊的时候,GPU 渲染的时日都不长,所以说大概在性质方面照旧有所欠佳。

图片 6

本来也恐怕跟模拟器有关系,真机上测量检验是不慢的。何况貌似比 FastBlur 还快一些,等空闲测验多少个高斯模糊达成情势的个性,来对待一下。

到此,这种实现高斯模糊的措施已经全体讲罢了,谢谢原博主这么赏心悦目标稿子,再度附上链接:

湫水长天 –
教你一分钟达成动态模糊效果

运用那几个工具的由来实在很简短,就是性质。因为关乎到绘图,所以只要质量特别,那么无论是对于高素质图片或许是变化相当多的须要都以很勤奋的,而那些工具则会丰硕发挥设备的总括本事(CPU和GPU)来进行测算,並且是利用C99衍生语言实行脚本编辑撰写的,相较于Java性能是大大的升高。

其他参考资料

RenderScript – Android
Developers

Android RenderScript入门(1)

高斯模糊效果完结方案及品质相比较 –
lcy福克斯

聊起那边,有个别同学就在此以前方了,C99衍生?What?那么些无需操心,对于高斯模糊那一个实现,谷歌官方已经交给了相应的设计方案,大家并不需求编写对应的脚本就能够动用了,所以不要操心。

类型源码

BlurDemo – IamXiaRui –
Github

 大家把一切难点分为五个部分:

    ①高斯模糊实现;

    ②动态高斯模糊实现 

① 高斯模糊完成

先是要表明,大家要动用Support Library,所以版本是有须求的:

     Android SDK Tools 版本必需超过等于22.2

     Android SDK Build-tools 版本必得高于等于18.1.0

借使没有达到规定的标准,请使用SDK Manager进级一下。

紧接着创制大家的工程,而且在对应Module(暗许成立的是app)的build.gradle文件中加入如下代码:

defaultConfig {
    ...
    renderscriptTargetApi 18
    renderscriptSupportModeEnabled true
  }

renderscriptTargetApi:本条平时和App扶植的最低版本相通就能够。

package com.fndroid.renderscriptdemo;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
  private ImageView mImageView;
  private Bitmap sampleImg;
  private Bitmap gaussianBlurImg;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mImageView = (ImageView) findViewById(R.id.iv);
    sampleImg = BitmapFactory.decodeResource(getResources(), R.drawable.icon); // 获取原图
    gaussianBlurImg = blur(sampleImg, 25f);
    mImageView.setImageBitmap(gaussianBlurImg);
  }

  private Bitmap blur(Bitmap bitmap,float radius) {
    Bitmap output = Bitmap.createBitmap(bitmap); // 创建输出图片
    RenderScript rs = RenderScript.create(this); // 构建一个RenderScript对象
    ScriptIntrinsicBlur gaussianBlue = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); // 创建高斯模糊脚本
    Allocation allIn = Allocation.createFromBitmap(rs, bitmap); // 创建用于输入的脚本类型
    Allocation allOut = Allocation.createFromBitmap(rs, output); // 创建用于输出的脚本类型
    gaussianBlue.setRadius(radius); // 设置模糊半径,范围0f<radius<=25f
    gaussianBlue.setInput(allIn); // 设置输入脚本类型
    gaussianBlue.forEach(allOut); // 执行高斯模糊算法,并将结果填入输出脚本类型中
    allOut.copyTo(output); // 将输出内存编码为Bitmap,图片大小必须注意
    rs.destroy(); // 关闭RenderScript对象,API>=23则使用rs.releaseAllContexts()
    return output;
  }
}

那边表明都注释在代码中了。必要理解的是RenderScript有八个本子,分别是:

     android.renderscript

     android.support.v8.renderscript

地点代码应用了第叁个,第一个的用法相像,能够活动尝试。

我们来理一下思路,因为RenderScript是依据于Script的,而上文也提起了,Script是由C99衍生语言编写,而代码中的ScriptIntrinsicBlur不怕对应于高斯模糊算法的剧本。而Allocation目的则是将Java中的对象转变为Script剧本所需项指标臂膀,代码中创立了七个Allocation对象分别用来当做输入和出口。接着设置了高斯模糊的半径(radius)。当调用forEach时,脚本会被试行,何况将执行结果填入输出对应的Allocation中,最终调用copyTo来退换为Bitmap对象回来。

效果图:

 图片 7

② 动态高斯模糊

成都百货上千时候,大家大概会需求二个图形以区别的混淆程度表现出来。你大概早已注意到上面方法中的模糊半径了,大家得以做叁个实验,便是经过八个SeekBar来动态退换这几个值看看效果:

 图片 8

由动图能够见到,我们拖动SeekBar的时候,SeekBar已经跟不上大家的拖动了。那是干什么?原因就是其一渲染工具即使质量相比很漂亮貌,可是一旦图片的身分和尺寸都较高的时候,我们直接实行更换模糊半径重新渲染的做法往往时不可取的。

做法是,先创设一张模糊的图片加载在ImageView中,接着在那个ImageView的地点再停放贰个加载原图ImageView,使用FrameLayout能够让这四个ImageView痴肥再一齐,接着当大家必要动态退换模糊程度的时候,更动上层的ImageViewBitmapAlpha就足以了。大家先看看效果图:

 图片 9

行使了这么些措施,滑动起来就能比较通畅了。(GIF加载完才是会是常规进程哦

那边给一下代码参谋吧:

public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
  private ImageView mImageView;
  private ImageView mImageViewCover;
  private Bitmap sampleImg;
  private Bitmap gaussianBlurImg;
  private SeekBar mSeekBar;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mImageView = (ImageView) findViewById(R.id.iv);
    mSeekBar = (SeekBar) findViewById(R.id.sb);
    mImageViewCover = (ImageView) findViewById(R.id.iv_cover);
    sampleImg = BitmapFactory.decodeResource(getResources(), R.drawable.icon); // 获取原图
    gaussianBlurImg = blur(sampleImg, 25f);
    mImageView.setImageBitmap(gaussianBlurImg);
    mSeekBar.setOnSeekBarChangeListener(this);
  }

  private Bitmap blur(Bitmap bitmap, float radius) {
    Bitmap output = Bitmap.createBitmap(bitmap); // 创建输出图片
    RenderScript rs = RenderScript.create(this); // 构建一个RenderScript对象
    ScriptIntrinsicBlur gaussianBlue = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); //
    // 创建高斯模糊脚本
    Allocation allIn = Allocation.createFromBitmap(rs, bitmap); // 开辟输入内存
    Allocation allOut = Allocation.createFromBitmap(rs, output); // 开辟输出内存
    gaussianBlue.setRadius(radius); // 设置模糊半径,范围0f<radius<=25f
    gaussianBlue.setInput(allIn); // 设置输入内存
    gaussianBlue.forEach(allOut); // 模糊编码,并将内存填入输出内存
    allOut.copyTo(output); // 将输出内存编码为Bitmap,图片大小必须注意
    rs.destroy(); // 关闭RenderScript对象,API>=23则使用rs.releaseAllContexts()
    return output;
  }

  @Override
  public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    int alpha = 255 - progress;
    mImageViewCover.setImageAlpha(alpha);
  }

  @Override
  public void onStartTrackingTouch(SeekBar seekBar) {

  }

  @Override
  public void onStopTrackingTouch(SeekBar seekBar) {

  }
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context="com.fndroid.renderscriptdemo.MainActivity">

  <FrameLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1">

    <ImageView
      android:id="@+id/iv"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

    <ImageView
      android:id="@+id/iv_cover"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:src="@drawable/icon"/>

  </FrameLayout>

  <SeekBar
    android:id="@+id/sb"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:max="255"/>

</LinearLayout>

总结

上述正是在Android中达成动态高斯模糊的全体内容,本文先是介绍了何等促成高斯模糊,而后才介绍完成动态效果,那样让大家更易于领会学习,希望本文对大家开拓Android有所支持。

您恐怕感兴趣的小说:

  • Android图片特效:黑白特效、圆角意义、高斯模糊
  • Android关于Glide的利用(高斯模糊、加载监听、圆角图形卡塔尔
  • Android中贯彻布局背景模糊化管理的点子
  • Android落成图片的高斯模糊(二种艺术卡塔尔(قطر‎
  • Android模糊管理完成图片毛玻璃效果
  • Android模糊管理大致完成毛玻璃效果
  • Android
    完成图片模糊、高斯模糊、毛玻璃效果的两种方法
  • Android达成个人资料页面头像背景模糊展现包(状态栏State of Qatar
  • Android调用系统摄像裁剪图片模糊的消除方式
  • Android实现部分模糊效果

发表评论

电子邮件地址不会被公开。 必填项已用*标注