详解Paint的setMaskFilter(MaskFilter maskfilter)

一、setMaskFilter(MaskFilter maskfilter)

setMaskFilter(MaskFilter maskfilter)是paint中的方法,它可以用来对图像进行一定的处理。这个方法需要传入一个MaskFilter对象。但MaskFilter类中没有任何实现方法,所以我们就要认识下它的两个子类BlurMaskFilter和EmbossMaskFilter,前者为模糊遮罩滤镜而后者为浮雕遮罩滤镜。

二、BlurMaskFilter

2.1 初识

我们在之前的cardView中讲解到cardview可以设置阴影效果,我先摆出之前文章的图片。

使用BlurMaskFilter可以轻松实现上面的阴影效果。

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setColor(Color.RED);
        // 设置画笔遮罩滤镜  ,传入度数和样式
        mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.SOLID));
        // 画一个矩形
        canvas.drawRect(200, 200, 600, 600, mPaint);
    }

说明:这个方法已经被标注为过时的方法了,如果你的应用启用了硬件加速,你是看不到任何阴影效果的。

如果在AndroidManifest.xml文件中关闭硬件加速那么我们整个应用都将不支持硬件加速,这显然是不科学的,如果可以只针对某个View关闭硬件加速那岂不是很好么?当然,Android也给我们提供了这样的功能,我们可以在View中通过:

setLayerType(LAYER_TYPE_SOFTWARE, null);

来关闭单个View的硬件加速功能。

2.2 构造函数

BlurMaskFilter只有一个含参的构造函数

BlurMaskFilter(float radius, BlurMaskFilter.Blur style)

第一个参数:radius很容易理解,值越大我们的阴影越扩散,用过PS的人会很容易理解,其实就是阴影范围。

第二个参数:style表示的是模糊的类型,上面我们用到的是SOLID,其效果就是在图像的Alpha边界外产生一层与Paint颜色一致的阴影效果而不影响图像本身,除了SOLID还有三种,NORMAL,OUTER和INNER。我们来逐个看看效果:

SOLID

其效果就是在图像的Alpha边界外产生一层与Paint颜色一致的阴影效果而不影响图像本身。

因为阴影的颜色是从色块中取出的,也是红色的,所以你感觉不是很舒服,如果阴影是黑色的就好很多了。

NORMAL

会将整个图像模糊掉。

OUTER

会在Alpha边界外产生一层阴影且会将原本的图像变透明。

INNER

会在图像内部产生模糊。可以看见阴影在色块的内部,有种淡淡的浮雕感。

INNER效果其实并不理想,实际应用中我们使用的也少。

2.3 给图片添加阴影

BlurMaskFilter是根据Alpha通道的边界来计算模糊的,如果用它对图片进行处理,你会发现没有任何效果。那么我们如何给图片加一个类似阴影的效果呢?其实很简单,我们可以尝试从Bitmap中获取其Alpha通道,并在绘制Bitmap前先以该Alpha通道绘制一个模糊效果就就行了。最终效果就是阴影图片叠加到原图的下方。

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Bitmap srcBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.kale);

        // 获取位图的Alpha通道图
        Bitmap shadowBitmap = srcBitmap.extractAlpha();

        mPaint.setColor(Color.DKGRAY);
        // 设置画笔遮罩滤镜 ,传入度数和样式
        mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));

        // 先绘制阴影
        canvas.drawBitmap(shadowBitmap, 200, 200, mPaint);

        // 画原图
        canvas.drawBitmap(srcBitmap, 200, 200, null);
    }

如果你好奇,底部的阴影图片是什么样子的,我们就不绘制原图,仅仅绘制后面的阴影图片看看。

三、EmbossMaskFilter

3.1 初识

相对于之前的BlurMaskFilter来说,EmbossMaskFilter的可用性比较低,因为它实现的效果不是很霸气。正如其名,他可以实现一种类似浮雕的效果,说白了就是让你绘制的图像感觉像是从屏幕中“凸”起来更有立体感一样(在设计软件中类似的效果称之为斜面浮雕)。

3.2 构造函数

EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)

这里面的各种参数理解起来比较复杂,如果想要详细的了解可以去看:http://blog.csdn.net/aigestudio/article/details/41447349

我这里就不做什么说明了,因为做浮雕的画,找ps就好了。

说明:本文大部分来自:http://blog.csdn.net/aigestudio/article/details/41316141,我对原文有细小的删减,记录在此作为学习笔记之用。

时间: 2024-12-27 07:49:07

详解Paint的setMaskFilter(MaskFilter maskfilter)的相关文章

详解Paint中的各种set方法

我们用set方法来设置画笔的样式,类似于我们挑选画笔画画的过程. set(Paint src) 顾名思义为当前画笔设置一个画笔,说白了就是把另一个画笔的属性设置Copy给我们的画笔,不累赘了 setAlpha(int a); 设置绘制图形的透明度,设置范围是[0..255] setAntiAlias(boolean aa) 打开抗锯齿.抗锯齿是依赖于算法的,算法决定抗锯齿的效率,在我们绘制棱角分明的图像时,比如一个矩形.一张位图,我们不需要打开抗锯齿. setARGB(int a, int r,

详解Paint的setPathEffect(PathEffect effect)

一.setPathEffect() 这个方法一看就和path有关,顾名思义,它就是给path设置样式(效果)的.PathEffect这个路径效果类没有具体的实现,效果是由它的六个子类实现的: 这六个子类分别可以实现不同的路径效果: 下面,我们来用代码来具体实现一下. 二.测试代码 2.1 代码框架 首先初始化paint和path,然后配置相关属性,最后作画. package com.kale.cview;public class CustomView extends View { // 实例化画

详解Paint的setXfermode(Xfermode xfermode)

一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是图像混合的一种,这个方法跟我们上面讲到的setColorFilter蛮相似的.查看API文档发现其果然有三个子类:AvoidXfermode, PixelXorXfermode和PorterDuffXfermode,这三个子类实现的功能要比setColorFilter的三个子类复杂得多. 二.Avo

详解Paint的setShader(Shader shader)

一.概述 setShader(Shader shader)中传入的自然是shader对象了,shader类是Android在图形变换中非常重要的一个类.Shader在三维软件中我们称之为着色器,其作用是来给图像着色.它有五个子类,像PathEffect一样,它的每个子类都实现了一种Shader.下面来看看文档中的解释: 子类:BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient 二.BitmapSha

Android基础入门教程——8.3.4 Paint API之—— Xfermode与PorterDuff详解(一)

Android基础入门教程--8.3.4 Paint API之-- Xfermode与PorterDuff详解(一) 标签(空格分隔): Android基础入门教程 本节引言: 不知道标题这两个玩意你熟不熟悉啦,如果自己实现过圆角或者圆形图片,相信对这两个名词 并不模式,一时半伙没想起来?没关系,下面这个图你可曾见过? PS:网上都说在:\samples\android-XX\legacy\ApiDemos\src\com\example\android\apis\graphics 下能找到这个

android Paint 详解

/**     * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关. * * 1.图形绘制 * setARGB(int a,int r,int g,int b); * 设置绘制的颜色,a代表透明度,r,g,b代表颜色值. * * setAlpha(int a); * 设置绘制图形的透明度. * * setCol

Android Paint、Path详解

都是自己随手练习时写的一些小demo Paint类: package com.gyz; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient;

图形绘制 Canvas Paint Path 详解

图形绘制简介        Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.graphics和android.graphics.drawable包中.他们提供了图形处理相关的Canvas.ColorFilter.Point.RetcF等类,还有一些动画相关的AnimationDrawable.BitmapDrawable.TransitionDrawable等.       以图形

转载爱哥自定义View系列--Paint详解

上图是paint中的各种set方法 这些属性大多我们都可以见名知意,很好理解,即便如此,哥还是带大家过一遍逐个剖析其用法,其中会不定穿插各种绘图类比如Canvas.Xfermode.ColorFilter等等的用法. set(Paint src) 顾名思义为当前画笔设置一个画笔,说白了就是把另一个画笔的属性设置Copy给我们的画笔,不累赘了 setARGB(int a, int r, int g, int b) 不扯了,别跟我说不懂 setAlpha(int a) 同上 setAntiAlias