组合渲染:
/** Shader的子类,返回由Xfermode子类组合的其他两个渲染器的组合。 */
public class ComposeShader extends Shader {
Shader mShaderA;
private long mNativeInstanceShaderA;
Shader mShaderB;
private long mNativeInstanceShaderB;
private int mPorterDuffMode;
/**
* 创建一个新的合成Shader,给定渲染器A、B和组合模式。
* 当应用该模式时,它将被赋予来自渲染器A的结果作为其“dst”,来自渲染器B的结果作为其“src”。
*
* @param shaderA 此渲染器中的颜色被此模式视为“dst”
* @param shaderB 此渲染器中的颜色被此模式视为“src”
* @param mode 组合来自两个着色器的颜色的模式。如果模式为空,则假定SRC_OVER。
*/
public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull Xfermode mode) {
this(shaderA, shaderB, mode.porterDuffMode);
}
/**
* 创建一个新的合成Shader,给定渲染器A、B和组合PorterDuff模式。
* 当应用该模式时,它将被赋予来自渲染器A的结果作为其“dst”,来自渲染器B的结果作为其“src”。
*
* @param shaderA 此渲染器中的颜色被此模式视为“dst”
* @param shaderB 此渲染器中的颜色被此模式视为“src”
* @param mode PorterDuff模式,将两个着色器的颜色组合在一起。
*/
public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB,
@NonNull PorterDuff.Mode mode) {
this(shaderA, shaderB, mode.nativeInt);
}
private ComposeShader(Shader shaderA, Shader shaderB, int nativeMode) {
if (shaderA == null || shaderB == null) {
throw new IllegalArgumentException("Shader parameters must not be null");
}
mShaderA = shaderA;
mShaderB = shaderB;
mPorterDuffMode = nativeMode;
}
@Override
long createNativeInstance(long nativeMatrix) {
mNativeInstanceShaderA = mShaderA.getNativeInstance();
mNativeInstanceShaderB = mShaderB.getNativeInstance();
return nativeCreate(nativeMatrix,
mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode);
}
/** @hide */
@Override
protected void verifyNativeInstance() {
if (mShaderA.getNativeInstance() != mNativeInstanceShaderA
|| mShaderB.getNativeInstance() != mNativeInstanceShaderB) {
// 子Shader本地实例已更新,因此我们缓存的本地实例不再有效-请丢弃它
discardNativeInstance();
}
}
/** @hide */
@Override
protected Shader copy() {
final ComposeShader copy = new ComposeShader(
mShaderA.copy(), mShaderB.copy(), mPorterDuffMode);
copyLocalMatrix(copy);
return copy;
}
private static native long nativeCreate(long nativeMatrix,
long nativeShaderA, long nativeShaderB, int porterDuffMode);
}