自定义View之Paint

来源:互联网 发布:移动硬盘数据同步软件 编辑:程序博客网 时间:2024/05/19 14:17

MaskFilter

MaskFilter用来实现滤镜的效果,如滤化,浮雕,立体等。

这里写图片描述

MaskFilter有两个子类:

  • BlurMaskFilter:模糊效果
  • EmbossMaskFilter:浮雕效果

在Paint中,通过setMaskFilter方法来设置MaskFilter。如果传入的为null,将表示不使用任何滤镜效果。

  • setMaskFilter(MaskFilter maskfilter): 设置MaskFilter

BlurMaskFilter(模糊效果)

先来看,BlurMaskFilter的构造函数:

BlurMaskFilter(float radius, BlurMaskFilter.Blur style)

它有两个参数:

  • radius:它是float类型,表示是Blur Radius,即阴影的模糊半径,其值越大表示图形绘制出来越模糊,其值越小图形越清晰。
  • style:它是BlurMaskFilter.Blur类型,用来表示阴影的模糊效果。

所谓的阴影效果,可以分为内阴影和外阴影,内阴影指的是阴影从图形轮廓向内侧扩张,外阴影指的是阴影从图形轮廓向外侧扩张。从阴影角度说,图形的绘制最多由三部分组成: 外阴影 + 图形本身内容 + 内阴影。

在BlurMaskFilter.Blur中,定义了系列的阴影效果:

  • NORMAL:会同时绘制图形本身内容+内阴影+外阴影,即正常阴影效果。
  • INNER:绘制图形内容本身+内阴影,不绘制外阴影。
  • OUTER:不绘制图形内容以及内阴影,只绘制外阴影,即图形轮廓以内完全不绘制,轮廓线以内完全是空白的。
  • SOLID:只绘制外阴影和图形内容本身,不绘制内阴影。

需要注意的是:

  1. 不管是哪种类型的阴影,当阴影模糊路径为0时,相当于没有阴影。随着阴影模糊半径变大,图形更模糊看不清。、
  2. 当绘制BitMap时,如果选择了OUTER类型,图片会不显示。
  3. 在创建BlurMaskFilter实例时,如果radius为0f,则会报异常

这里写图片描述

EmbossMaskFilter

EmbossMaskFilter用于实现浮雕效果。所谓的浮雕效果其实就是模拟光照效果,靠近光的一面显得亮一点,远离光的一面显得暗一点,这样就通过颜色的亮暗营造出浮雕的3D立体效果。而EmbossMaskFilter正是用来指定光源的方向和环境强度来指定浮雕效果。

先看EmbossMaskFilter的构造函数:

  • direction:是float数组,定义长度为3的数组标量[x,y,z],来指定光源的方向。这个数组表示光线的方向,分别是x分量,y分量,z分量,它们值得的大小并不重要,最后都会归一为长度为1单位向量。
  • ambient:表示环境光因子,float类型,取值是0到1,值越接近于0,环境光越暗,值越接近于1,环境光越亮
  • specular:表示镜面反射因子,float类型,取值也是0到1。镜面反射就是模拟像镜子一样的高光反射,值越接近于0,镜面反射越强,被光照照射到的地方更容易出现很白很亮的状态,即高光效果。
  • blurRadius:表示模糊半径,是float类型,其值越大,模糊效果越明显。

关闭硬件加速

值得注意的是,当我们设置了MaskFilter并没有效果。那是因为当targetSdkVersion >= 14的时候,MaskFilter就不会起效果了,这是因为Android在API 14以上版本都是默认开启硬件加速的,这样充分利用GPU的特性,使得绘画更加平滑,但是会多消耗一些内存。既然这样,就需要我们手动地关闭硬件加速了。关闭硬件加速有以下几种方式:

  • Application:在配置文件的application节点添加:

    android:hardwareAccelerated=”true”
  • Activity:在配置文件的activity节点添加

    android:hardwareAccelerated=”false”
  • View:可以获得View对象后调用,或者直接在View的onDraw()方法里设置:

    view.setLayerType(View.LAYER_TYPE_HARDWARE, null);




若想了解更多Paint相关的内容,请跳入: 自定义View系列文章目录




如果觉得我的文章对您有用,请随意点赞、评论。您的支持将鼓励我继续创作!