渲染器
Shader.TileMode 三個(gè)類型
1.CLAMP
當(dāng)填充區(qū)域大于填充物,會(huì)以填充物體最后一個(gè)像素水平或者垂直方向上的延申
2.REPEAT
以填充物水平和垂直方向上的復(fù)制平鋪填充
3.MIRROR(鏡像)
以填充物水平或者垂直方向上的翻轉(zhuǎn)平鋪填充
1.效果
如下圖:分別是 1:線性 2:環(huán)形 3:掃描 4:位圖 5:組合

0001.jpg
override fun draw(canvas: Canvas?) {
super.draw(canvas)
setShader(canvas)
}
fun setShader(canvas: Canvas?){
canvas?.drawLine(50F,50F,600F,50F,mPaint)
mPaint.setShader(SweepGradient(200F, 200F, Color.RED, Color.YELLOW)) //環(huán)形渲染器
canvas?.drawLine(50F,150F,600F,150F,mPaint)
}
2.線性渲染(LinearGradient)
fun LinearGradient(canvas: Canvas?) {
/**
* LinearGradient(float x0, float y0, float x1, float y1,int[] colors,float[] positions,TileMode tile)
* x0,y0 表示渲染的起點(diǎn)
* x1,y1 表示渲染的終點(diǎn)
* colors[]表示渲染顏色的集合
* positions[]對(duì)應(yīng)顏色集合每個(gè)顏色從哪個(gè)位置渲染(按照百分比的 ositions[0...1])
* tile 端點(diǎn)范圍之外的著色規(guī)則
*/
mPaint.setShader(LinearGradient(0F,0F,500F,500F, intArrayOf(Color.BLUE,Color.RED,Color.YELLOW),
floatArrayOf(0F,0.5F,1F),Shader.TileMode.CLAMP))
canvas?.drawRect(0F,0F,500F,500F,mPaint)
}
3.環(huán)形渲染(RadialGradient)
fun RadialGradient(canvas: Canvas?) {
/**
* 環(huán)形渲染
* RadialGradient(float centerX, float centerY, float radius,int[] colors,float[] positions,TileMode tile)
* centerX,centerY 表示渲染的中心
* radius 表示環(huán)形渲染半徑
* colors[]表示渲染顏色的集合
* positions[]對(duì)應(yīng)顏色集合每個(gè)顏色從哪個(gè)位置渲染(按照百分比的 ositions[0...1])
* tile 端點(diǎn)范圍之外的著色規(guī)則
*/
mPaint.setShader(RadialGradient(250F,250F,250F, intArrayOf(Color.BLUE,Color.RED,Color.YELLOW),
floatArrayOf(0F,0.5F,1F),Shader.TileMode.MIRROR))
canvas?.drawRect(0F,0F,500F,500F,mPaint)
}
4.掃描渲染(SweepGradient)
fun SweepGradient(canvas: Canvas?) {
/*
*
* RadialGradient(float centerX, float centerY, float radius,int[] colors,float[] positions,TileMode tile)
* centerX,centerY 表示渲染的中心
* colors[]表示渲染顏色的集合
* positions[]對(duì)應(yīng)顏色集合每個(gè)顏色從哪個(gè)位置渲染(按照百分比的 ositions[0...1])
* tile 端點(diǎn)范圍之外的著色規(guī)則
*/
mPaint.setShader(
SweepGradient(
250F, 250F, intArrayOf(Color.BLUE, Color.RED, Color.YELLOW),
floatArrayOf(0F, 0.5F, 1F)
)
)
canvas?.drawRect(0F, 0F, 500F, 500F, mPaint)
}
4.位圖渲染(BitmapShader)
fun BitmapShader(canvas: Canvas?) {
/*
* BitmapShader(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY)
* bitmap 渲染圖片
* tileX 端點(diǎn)范圍之外的著色規(guī)則
* tileY 端點(diǎn)范圍之外的著色規(guī)則·
*/
mPaint.setShader(BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR))
canvas?.drawRect(0F, 0F, 500F, 500F, mPaint)
}
5.組合渲染(ComposeShader)
ComposeShader 例如 LinearGradient+BitmapGradient
fun ComposeShader(canvas: Canvas?) {
/*
* ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull PorterDuff.Mode mode)
* shaderA 渲染器A
* shaderB 渲染器B
* mode 渲染模式
*/
var mRadialGradient = RadialGradient(
250F, 250F, 250F, intArrayOf(Color.BLUE, Color.RED, Color.YELLOW),floatArrayOf(0F, 0.5F, 1F), Shader.TileMode.MIRROR )
var mBitmapShader = BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR)
mPaint.setShader(ComposeShader(mBitmapShader, mRadialGradient, PorterDuff.Mode.LIGHTEN))
canvas?.drawRect(0F, 0F, 500F, 500F, mPaint)
}
示例代碼
class ShaderExample:View {
constructor(context: Context?) : this(context,null)
constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs,0)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
var mPaint = Paint()
lateinit var mBitmap: Bitmap
init {
mPaint.setARGB(255, 255, 0, 0)
mPaint.isAntiAlias = true //是否抗鋸齒
mPaint.style = Paint.Style.FILL // 描邊填充效果 1.STROKE 描邊 2.FIll 填充 3.FILL_AND_STROKE 描邊+填充
mPaint.strokeWidth = 50F // 描邊寬度
mBitmap = BitmapFactory.decodeResource(context.resources, R.mipmap.img_01)
}
override fun draw(canvas: Canvas?) {
super.draw(canvas)
LinearGradient(canvas)
RadialGradient(canvas)
SweepGradient(canvas)
BitmapShader(canvas)
ComposeShader(canvas)
}
/**
* 1線性渲染
*/
fun LinearGradient(canvas: Canvas?) {
/*
* LinearGradient(float x0, float y0, float x1, float y1,int[] colors,float[] positions,TileMode tile)
* x0,y0 表示渲染的起點(diǎn)
* x1,y1 表示渲染的終點(diǎn)
* colors[]表示渲染顏色的集合
* positions[]對(duì)應(yīng)顏色集合每個(gè)顏色從哪個(gè)位置渲染(按照百分比的 ositions[0...1])
* tile 端點(diǎn)范圍之外的著色規(guī)則
*/
mPaint.setShader(
LinearGradient(
0F, 0F, 500F, 500F, intArrayOf(Color.BLUE, Color.RED, Color.YELLOW),
floatArrayOf(0F, 0.5F, 1F), Shader.TileMode.CLAMP
)
)
canvas?.drawRect(0F, 0F, 500F, 500F, mPaint)
}
/**
*2環(huán)形渲染
*/
fun RadialGradient(canvas: Canvas?) {
/*
*
* RadialGradient(float centerX, float centerY, float radius,int[] colors,float[] positions,TileMode tile)
* centerX,centerY 表示渲染的中心
* radius 表示環(huán)形渲染半徑
* colors[]表示渲染顏色的集合
* positions[]對(duì)應(yīng)顏色集合每個(gè)顏色從哪個(gè)位置渲染(按照百分比的 ositions[0...1])
* tile 端點(diǎn)范圍之外的著色規(guī)則
*/
mPaint.setShader(
RadialGradient(
750F, 250F, 250F, intArrayOf(Color.BLUE, Color.RED, Color.YELLOW),
floatArrayOf(0F, 0.5F, 1F), Shader.TileMode.MIRROR
)
)
canvas?.drawRect(500F, 0F, 1000F, 500F, mPaint)
}
/**
* 3掃描渲染
*/
fun SweepGradient(canvas: Canvas?) {
/*
*
* RadialGradient(float centerX, float centerY, float radius,int[] colors,float[] positions,TileMode tile)
* centerX,centerY 表示渲染的中心
* colors[]表示渲染顏色的集合
* positions[]對(duì)應(yīng)顏色集合每個(gè)顏色從哪個(gè)位置渲染(按照百分比的 ositions[0...1])
* tile 端點(diǎn)范圍之外的著色規(guī)則
*/
mPaint.setShader(
SweepGradient(
250F, 750F, intArrayOf(Color.BLUE, Color.RED, Color.YELLOW),
floatArrayOf(0F, 0.5F, 1F)
)
)
canvas?.drawRect(0F, 500F, 500F, 1000F, mPaint)
}
/**
*4位圖渲染
*/
fun BitmapShader(canvas: Canvas?) {
/*
* BitmapShader(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY)
* bitmap 渲染圖片
* tileX 端點(diǎn)范圍之外的著色規(guī)則
* tileY 端點(diǎn)范圍之外的著色規(guī)則
*/
mPaint.setShader(BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR))
canvas?.drawRect(500F, 500F, 1000F, 1000F, mPaint)
}
/**
*5組合渲染
*/
fun ComposeShader(canvas: Canvas?) {
/*
* ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull PorterDuff.Mode mode)
* shaderA 渲染器A
* shaderB 渲染器B
* mode 渲染模式
*/
var mRadialGradient = RadialGradient(
250F, 1250F, 250F, intArrayOf(Color.BLUE, Color.RED, Color.YELLOW),floatArrayOf(0F, 0.5F, 1F), Shader.TileMode.MIRROR )
var mBitmapShader = BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR)
mPaint.setShader(ComposeShader(mBitmapShader, mRadialGradient, PorterDuff.Mode.LIGHTEN))
canvas?.drawRect(0F, 1000F, 500F, 1500F, mPaint)
}
/**
* 渲染器 簡(jiǎn)潔版
*/
fun setShader(canvas: Canvas?) {
canvas?.drawLine(50F, 50F, 600F, 50F, mPaint)
mPaint.setShader(SweepGradient(200F, 200F, Color.RED, Color.YELLOW)) //渲染器
canvas?.drawLine(50F, 150F, 600F, 150F, mPaint)
}
}