欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > Filter -> MaskFilter遮罩滤镜详解

Filter -> MaskFilter遮罩滤镜详解

2025/2/25 11:07:08 来源:https://blog.csdn.net/sunshine_guo/article/details/145476489  浏览:    关键词:Filter -> MaskFilter遮罩滤镜详解

MaskFilter

  • 作用对象:MaskFilter 主要用于Paint的外观效果,给用Paint绘制的内容添加模糊或者浮雕效果
  • 应用效果:
    • MaskFilter 处理位图的遮罩效果,影响绘制的边缘或整体形状
    • 主要用于模糊处理、浮雕效果等,通过影响绘制对象的边缘来实现
  • 常用子类:
    BlurMaskFilter:实现模糊效果,可以设置不同的模糊样式(NORMAL、SOLID、OUTER、INNER)
    EmbossMaskFilter:创建浮雕效果,通过设置光源方向、环境光强度等来实现

BlurMaskFilter模糊遮罩滤镜

  • Java源码
public class BlurMaskFilter extends MaskFilter {public enum Blur {/*** Blur inside and outside the original border.*/NORMAL(0),/*** Draw solid inside the border, blur outside.*/SOLID(1),/*** Draw nothing inside the border, blur outside.*/OUTER(2),/*** Blur inside the border, draw nothing outside.*/INNER(3);Blur(int value) {native_int = value;}final int native_int;}/*** Create a blur maskfilter.** @param radius The radius to extend the blur from the original mask. Must be > 0.* @param style  The Blur to use* @return       The new blur maskfilter*/public BlurMaskFilter(float radius, Blur style) {native_instance = nativeConstructor(radius, style.native_int);}private static native long nativeConstructor(float radius, int style);
}
  • 构造函数详解
    • radius(模糊半径)
      • 类型:float
      • 作用:指定模糊的强度。值越大,模糊效果越明显。
      • 描述:模糊半径决定了模糊的范围,单位通常是像素。较小的值会产生轻微的模糊,而较大的值会导致显著的模糊效果。
    • style(模糊样式):
      • 类型:BlurMaskFilter.Blur
      • 作用:决定模糊的应用方式,即模糊效果的样式。
      • 可用值:
        • Blur.NORMAL
        • 描述:模糊内外边框+绘制内容。适用于需要整体柔和模糊效果的场景
        • Blur.SOLID
        • 描述:模糊内外边框+不模糊绘制内容。适用于增强物体的边缘
        • Blur.OUTER
        • 描述:只模糊外边框+不模糊内边框+内边框内的绘制内容透明显示。适用于突出物体本身
        • Blur.INNER
        • 描述:只模糊内边框+不模糊外边框+外边框外的绘制内容透明显示。适用于创建内嵌阴影或凹陷效果
  • XML文件
<?xml version="1.0" encoding="utf-8"?>
<com.example.myapplication.MyViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" />
  • 自定义View代码
class MyView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {private val mDrawPaint: Paint = Paint().apply {isDither = trueisAntiAlias = trueisFilterBitmap = truecolor = Color.BLUE}private val radius = 100fprivate val spacing = 500foverride fun onDraw(canvas: Canvas) {super.onDraw(canvas)// Draw circle with NORMAL blurmDrawPaint.maskFilter = BlurMaskFilter(20f, BlurMaskFilter.Blur.NORMAL)canvas.drawCircle(spacing, spacing, radius, mDrawPaint)// Draw circle with SOLID blurmDrawPaint.maskFilter = BlurMaskFilter(20f, BlurMaskFilter.Blur.SOLID)canvas.drawCircle(spacing , spacing * 2, radius, mDrawPaint)// Draw circle with OUTER blurmDrawPaint.maskFilter = BlurMaskFilter(20f, BlurMaskFilter.Blur.OUTER)canvas.drawCircle(spacing , spacing * 3, radius, mDrawPaint)// Draw circle with INNER blurmDrawPaint.maskFilter = BlurMaskFilter(20f, BlurMaskFilter.Blur.INNER)canvas.drawCircle(spacing , spacing * 4, radius, mDrawPaint)}
}
  • 效果图
    在这里插入图片描述

EmbossMaskFilter浮雕遮罩滤镜

  • Java源码
public class EmbossMaskFilter extends MaskFilter {/*** Create an emboss maskfilter** @deprecated This subclass is not supported and should not be instantiated.** @param direction  array of 3 scalars [x, y, z] specifying the direction of the light source* @param ambient    0...1 amount of ambient light* @param specular   coefficient for specular highlights (e.g. 8)* @param blurRadius amount to blur before applying lighting (e.g. 3)* @return           the emboss maskfilter*/@Deprecatedpublic EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius) {if (direction.length < 3) {throw new ArrayIndexOutOfBoundsException();}native_instance = nativeConstructor(direction, ambient, specular, blurRadius);}private static native long nativeConstructor(float[] direction, float ambient, float specular, float blurRadius);
}
  • 构造函数详解
    • direction(光源方向):
      • 类型:float[]
      • 作用:指定光源的方向。
      • 描述:这是一个长度为 3 的数组,分别表示光源在 x、y、z 轴上的方向分量。正常情况下,这些值不需要是单位向量,但它们定义了光源的相对方向。根据光源的方向,浮雕的阴影和高光效果会有所不同
    • ambient(环境光):
      • 类型:float
      • 作用:定义环境光的强度
      • 范围:通常在 01 之间
      • 描述:环境光影响整个浮雕效果的亮度。值越大,整体效果越亮,越小则越暗
    • specular(高光反射系数):
      • 类型:float
      • 作用:定义高光的反射强度
      • 描述:高光反射系数影响浮雕效果中高光部分的亮度。较高的值会使高光更明显,较低的值则使高光不明显
    • blurRadius(模糊半径):
      • 类型:float
      • 作用:定义浮雕效果的模糊半径
      • 描述:模糊半径决定了浮雕边缘的模糊程度。较小的值会使浮雕边缘更锐利,而较大的值会使边缘更加柔和
  • XML文件
<?xml version="1.0" encoding="utf-8"?>
<com.example.myapplication.MyViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" />
  • 自定义View代码
class MyView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {private var mPaint: Paint = Paint().apply {isAntiAlias = truecolor = Color.RED  // 用红色以更好地展示浮雕效果}private var embossFilter: EmbossMaskFilter? = nullinit {// 设置浮雕效果的参数val direction = floatArrayOf(1f, 0f, 0f) // 从上方垂直照射光源val ambient = 0.6f                       // 较低的环境光val specular = 5f                        // 较高的高光反射val blurRadius = 50f                      // 适中的模糊半径embossFilter = EmbossMaskFilter(direction, ambient, specular, blurRadius)mPaint.maskFilter = embossFiltersetLayerType(LAYER_TYPE_SOFTWARE, mPaint)}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)canvas.drawColor(Color.DKGRAY) // 设置深灰色背景以增加对比度// 设置椭圆的矩形边界val left = 100fval top = 100fval right = width - 100fval bottom = height - 100f// 绘制椭圆canvas.drawOval(left, top, right, bottom, mPaint)}
}
  • 效果图
    -在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词