BlendMode.MODULATE对应的才是PorterDuff.Mode.MULTIPLY
在android.graphics.BlendMode的blendModeToPorterDuffMode有如下代码:
public static @Nullable PorterDuff.Mode blendModeToPorterDuffMode(@Nullable BlendMode mode) {
if (mode != null) {
switch (mode) {
// b/73224934 PorterDuff Multiply maps to Skia Modulate
case MODULATE:
return PorterDuff.Mode.MULTIPLY;
}
} else {
return null;
}
}
从注释中也可以看出区别
public enum BlendMode {
/**
* {@usesMathJax}
*
* <p>
* <img src="{@docRoot}reference/android/images/graphics/blendmode_MODULATE.png" />
* <figcaption>Multiplies the source and destination pixels.</figcaption>
* </p>
* <p>\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)</p>
* <p>\(C_{out} = C_{src} * C_{dst}\)</p>
*
*/
MODULATE(13),
/**
* {@usesMathJax}
*
* <p>
* <img src="{@docRoot}reference/android/images/graphics/blendmode_MODULATE.png" />
* <figcaption>Multiplies the source and destination pixels.</figcaption>
* </p>
* <p>\(\alpha_{out} = \alpha_{src} + \alpha_{dst} - \alpha_{src} * \alpha_{dst}\)</p>
* <p>\(C_{out} =
* C_{src} * (1 - \alpha_{dst}) + C_{dst} * (1 - \alpha_{src}) + (C_{src} * C_{dst})\)
* </p>
*/
MULTIPLY(24),
}
public enum Mode {
/**
* <p>
* <img src="{@docRoot}reference/android/images/graphics/composite_MULTIPLY.png" />
* <figcaption>Multiplies the source and destination pixels.</figcaption>
* </p>
* <p>\(\alpha_{out} = \alpha_{src} * \alpha_{dst}\)</p>
* <p>\(C_{out} = C_{src} * C_{dst}\)</p>
*/
MULTIPLY (13),
}
可以看出BlendMode.MODULATE与PorterDuff.Mode.MULTIPLY算法一致,均是
alpha_{out} = alpha_{src} * alpha_{dst}
C_{out} = C_{src} * C_{dst}