上一篇播客说了下paint画笔的基本使用,这里继续说下paint画笔的基本使用——渲染,paint画笔的渲染涉及到下面几种渲染方式:
BitmapShader 位图的图像渲染器
LinearGradient 线性渲染
RadialGradient 环形渲染
SweepGradient 梯度渲染(扫描渲染)
ComposeShader 组合渲染
BitmapShader 位图的图像渲染器
BitmapShader在使用的时候直接new一个就可以,根据需要传入参数;
/** *
* @param bitmap 对应的要渲染的bitmap位图
* @param tileX X轴对应的渲染模式
* @param tileY Y轴对应的要渲染的模式
*/
public BitmapShader(@NonNull Bitmap bitmap, TileMode tileX, TileMode tileY) {
mBitmap = bitmap;
mTileX = tileX;
mTileY = tileY;
init(nativeCreate(bitmap, tileX.nativeInt, tileY.nativeInt));
}
这里对应的模式有三种:
/**
* TileMode.CLAMP 拉伸最后一个像素去铺满剩下的地方
* TileMode.MIRROR 通过镜像翻转铺满剩下的地方。
* TileMode.REPEAT 重复图片平铺整个画面(电脑设置壁纸)
*/
结合paint简单使用:
private void doShaderView(Canvas canvas){
/**
* TileMode.CLAMP 拉伸最后一个像素去铺满剩下的地方
* TileMode.MIRROR 通过镜像翻转铺满剩下的地方。
* TileMode.REPEAT 重复图片平铺整个画面(电脑设置壁纸)
*/
BitmapShader bitmapShader=new BitmapShader(bitmap, Shader.TileMode.MIRROR,Shader.TileMode.MIRROR);
mPaint.setShader(bitmapShader);
canvas.drawRect(new Rect(0,0,bitmapWidth*2,bitmapHeight*2),mPaint);
}
(TileMode.MIRROR效果)
(TileMode.CLAMP效果)
(TileMode.REPEAT效果)
LinearGradient 线性渲染
/** Create a shader that draws a linear gradient along a line.
@param x0 x起点
@param y0 y起点
@param x1 x终点
@param y1 y终点
@param colors 渐变的颜色(数组)
@param positions 数组大小跟colors数组一样大,中间依次摆放的几个颜色分别放置在那个位置上(参考比例从左往右) 可以为空
@param tile 渐变的模式
*/
public LinearGradient(float x0, float y0, float x1, float y1, int colors[], float positions[],
TileMode tile) {
...
}
/**
* LinearGradient渲染
* @param canvas
*/
private void doLinearGradient(Canvas canvas){
LinearGradient linearGradient=new LinearGradient(0,0,600,600,colors,null, Shader.TileMode.MIRROR);
mPaint.setShader(linearGradient);
canvas.drawRect(0, 0, 400, 400, mPaint);
}
**RadialGradient 环形渲染**
/**
@param centerX x中心点
@param centerY y中心点
@param radius 半径
@param colors 渐变的颜色(数组)
@param positions 数组大小跟colors数组一样大,中间依次摆放的几个颜色分别放置在那个位置上(参考比例从左往右) 可以为空
@param tile 渐变的模式
*/
public RadialGradient(float centerX, float centerY, float radius, int colors[], float positions[],
TileMode tile) {
...
}
SweepGradient 梯度渲染(扫描渲染)
/**
* A subclass of Shader that draws a sweep gradient around a center point.
*
* @param cx x中心点
* @param cy Y中心点
* @param colors 渐变颜色(数组)
* @param positions 渐变的位置(数组) 可以传空
*/
public SweepGradient(float cx, float cy,
int colors[], float positions[]) {
...
}
/**
* SweepGradient渲染
* @param canvas
*/
private void doSweepGradient(Canvas canvas){
SweepGradient sweepGradient=new SweepGradient(300,300,colors,null);
mPaint.setShader(sweepGradient);
canvas.drawCircle(300, 300, 300, mPaint);
}
ComposeShader 组合渲染
/**
@param shaderA 渲染类型A
@param shaderB 渲染类型B
@param mode 渲染模式
*/
public ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode) {
mType = TYPE_PORTERDUFFMODE;
mShaderA = shaderA;
mShaderB = shaderB;
mPorterDuffMode = mode;
init(nativeCreate2(shaderA.getNativeInstance(), shaderB.getNativeInstance(),
mode.nativeInt));
}
/**
* ComposeShader 组合渲染
*/
private void doComposeShader(Canvas canvas){
LinearGradient linearGradient=new LinearGradient(0,0,600,600,colors,null, Shader.TileMode.MIRROR);
BitmapShader bitmapShader=new BitmapShader(bitmap, Shader.TileMode.REPEAT,Shader.TileMode.REPEAT);
ComposeShader composeShader=new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.SRC_OVER);
mPaint.setShader(composeShader);
canvas.drawRect(0, 0, 400, 600, mPaint);
}