自定义View之Paint - ComposeShader

ComposeShader

ComposeShader的作用是实现两个颜色渐变效果的叠加,如BitmapShader与LinearGradient的混合渲染效果等,叠加的效果由过渡模式(Xfermode)或者PorterDuff.Mode来决定。

它有两个构造函数:

  • ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)
  • ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)

其各参数的意义如下:

  • shaderA:表示某一种渲染效果
  • shaderB:表示某一种渲染效果
  • mode:叠加的效果模式。对于过渡模式(Xfermode)或者PorterDuff.Mode不再过多的描述,不了解的,可参考博文逐一认识PorterDuff.Mode

现有一个线性的颜色渐变(lgsShader):

val colorResA = resources.getColor(android.R.color.holo_red_dark)
val colorResB = resources.getColor(android.R.color.holo_blue_dark)
val colorResC = resources.getColor(android.R.color.black)
val colorResD = resources.getColor(android.R.color.holo_green_dark)

val colorArray = intArrayOf(colorResA, colorResB, colorResC, colorResD)
val positionArray = floatArrayOf(0.0f, 0.3f, 0.4f, 1.0f)

val lgsShader = LinearGradient(0f, 0f, widthView / 4f, 0f,
        colorArray, positionArray, Shader.TileMode.REPEAT)

线性渐变效果:

这里写图片描述

又有一个扫描渐变(sweepGradient):

val colorResA = resources.getColor(android.R.color.holo_red_dark)
val colorResB = resources.getColor(android.R.color.holo_blue_dark)
val colorResC = resources.getColor(android.R.color.black)
val colorResD = resources.getColor(android.R.color.holo_green_dark)

val colorArray = intArrayOf(colorResA, colorResB, colorResC, colorResD)
val positionArray = floatArrayOf(0.0f, 0.3f, 0.4f, 1.0f)

val sweepGradient = SweepGradient(widthView / 2.0f, heightView / 2.0f, colorArray, positionArray)

扫描渐变效果:

这里写图片描述

而,PorterDuff.Mode.LIGHTEN的效果是:保留原图像和目标图像的像素的最大的分量,效果就是源图像和目标图像相交的部分变亮

此时,将lgsShader和sweepGradient按照PorterDuff.Mode.LIGHTEN模式效果叠加:

val composeShader = ComposeShader(lgsShader, sweepGradient, PorterDuff.Mode.LIGHTEN)

mPaint.shader = composeShader

canvas?.drawCircle(widthView / 2.0f, heightView / 2.0f, radius, mPaint)

效果如下:

这里写图片描述

对于我们所熟悉的是PorterDuff.Mode又分为Alpha合成模式和混合模式。对于ComposeShader而言,不管是采用哪种混合模式都应慎用,达到的效果太不可控。




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




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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值