您的位置:首页 > 移动开发 > Android开发

Android Shader 颜色、图像渲染 paint.setXfermode

2017-07-28 18:19 375 查看


Shader

Shader是一个基类,表示在绘制期间颜色的水平跨度

它的子类被嵌入在Paint中使用,调用paint.setShader(shader)。

除Bitmap外的其他对象,使用该Paint进行绘制时。将从shader中获得颜色

Shader.TileMode 渲染模式

public enum TileMode {
CLAMP   (0),
REPEAT  (1),
MIRROR  (2);
TileMode(int nativeInt) {
this.nativeInt = nativeInt;
}
final int nativeInt;
}
CLAMP:假设超出原始bounds(即原图的边界)。则反复边缘上的color

REPEAT:反复bitmap

MIRROR:反复bitmap,与REPEAT不同的时,它是镜像反复,即:反向反复

Shader 子类:

BitmapShader (android.graphics) 图像渲染

ComposeShader (android.graphics) 组合渲染

LinearGradient (android.graphics) 线性渲染

RadialGradient (android.graphics) 环形渲染

SweepGradient (android.graphics) 扫描渲染

BitmapShader

new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.MIRROR); 以某个渲染模式 进行 图像渲染

ComposeShader

new ComposeShader(shaderA, shaderB, PorterDuff.Mode.DST); 组合两种渲染效果。以PorterDuff.Mode进行组合

LinearGradient

new LinearGradient(0, 0, bitmap.getWidth(), bitmap.getHeight(), 0x470000ff,0xefffff00, Shader.TileMode.CLAMP);

在一定区域内。以某种渲染模式,进行两种颜色间的线性变化

new LinearGradient(0, 0, bitmap.getWidth(), bitmap.getHeight(), new int[]{0xffabc777, 0x2300ff00, 0x470000ff, 0xefffff00}, new float[]{0.1f, 0.3f, 0.5f, 1.0f}, Shader.TileMode.CLAMP)。

在一定区域内,以某种渲染模式。进行一组颜色间的线性变化。变化的位置由float数组决定。要求int数组和float数组。长度一致

RadialGradient

以点(x,y),半径为r。进行环形渲染

new RadialGradient(w/2, h/2, Math.min(w, h) /2, 0xddff00f0, 0xffabc777, Shader.TileMode.REPEAT);

new RadialGradient(w/2, h/2, Math.min(w, h) /2, new int[]{0xddff0000, 0x2300ff00, 0x470000ff, 0xffabc777}, new float[]{0.1f, 0.3f, 0.5f, 1.0f}, Shader.TileMode.CLAMP);

SweepGradient

以点(x,y),进行扫描渲染

new SweepGradient(w/2, h/2, 0xddff00f0, 0xffabc777);

new SweepGradient(w, h, new int[]{0xffff0000, 0xff00ff00, 0xff0000ff, 0xffabc777, 0xffee00ee}, new float[]{0.2f, 0.4f, 0.6f, 0.75f, 1f});

PorterDuff.Mode



canvas.drawBitmap(mDstB, 0, 0, paint);//先绘制目标
paint.setXfermode(sModes[i]);// 使用mode  
//paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(mSrcB, 0, 0, paint);//再绘制源paint.setXfermode(null);//清除mode
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: