setShader( Shader mShader) 是Paint 的一个api。他主要是通过 Shader 的子类 实现一种着色的效果(给paint 设置一种绘图策略,类似于 颜色,阴影等)。
BitmapShader
public BitmapShader(Bimap bimap,TitleMode modeX,TitleMode modeY);
modeX:当View的宽度,大于bitmap 的宽度时,bitmap 在横轴方向的排版方式。
modeY:当View的高度,大于bitmap 的高度时,bitmap在纵轴方向的排版方式。
public enum TileMode {
//边缘色彩填充多余空间
CLAMP (0),
//重复使用原图来填充多余空间
REPEAT (1),
//重复使用镜像模式填充多余空间
MIRROR (2)
}
效果:
a.modeX ,modeY 都为 Repeat (重复)模式
b.modeX ,modeY 都为 Mirror(镜像) 模式
c.modeX,modeY 都为 Clamp(拉升) 模式(先竖向填充,然后横向填充)
注意:modeX,modeY 可以使用不同模式,组合使用
如果bitmap的尺寸大于 View 的尺寸呢?当然重复填充模式肯定会无用,那到底会怎样显示呢?
效果:类似于 首先将整张大图片绘制在canvas 上,然后截取了我们实际需要的尺寸 移步查看实战——
刮刮乐效果
如果 在第一张效果(a)的基础上,我drawCircle 的半径变小,那效果又会怎样呢?
红色圆形区域,就是我们有开始例子的范围
总结:无论绘制多大图像,在哪里绘制都与Shader无关。Shader 永远是从控件的左上角开始,而我们绘制的只是显示出来的部分而已。
LinearGradient
1.public LinearGradient(float startX,float startY,float endX,flat endY ,int startColor,int endColor, TileMode tile);
2.public LinearGradient(float startX,float startY,float endX,flat endY ,int tileColor[ ],float position[ ] TileMode tile);
参数说明:
(startX, startY)——起始渐变点坐标
(endX,endY)——终止渐变点坐标
statColor ——其实颜色(0xAARRGGBB 16进制形式表示,透明度不能少)
endColor ——其实颜色(0xAARRGGBB 16进制形式表示,透明度不能少)
tileColor[ ]——渐变颜色数组(0xAARRGGBB 16进制形式表示,透明度不能少)
positions[ ]——与 titleColor[ ]对应,取值0~1 ,表示每种颜色在整条渐变线中的占比。
RadialGradient
是shader的一种派生类,主要表现形式,类似于从一点发散的效果
1.public RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode) ;
2.public RadialGradient(float centerX, float centerY, float radius, colors[], float stops[], TileMode tileMode)
参数说明:
(centerX,CenterY)——渐变中心的坐标。
radius——渐变半径。
centerColor——渐变中心的颜色。(8位)
edgeColor——渐变结束的颜色值。
titleMode——填充模式。
colors[]——渐变颜色组
stops[] 表示colors[] 中的颜色,所占的百分比。
以上效果的测试都没有贴代码,好像有点说不过去。下面撸个效果吧☺。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int radius=getWidth()/3;
RadialGradient mRadiaGradient=new RadialGradient(getWidth()/2,getHeight()/2,radius,
0Xff00ff00,0xff0f00ff, Shader.TileMode.REPEAT);
Paint mPaint=new Paint();
mPaint.setShader(mRadiaGradient);
canvas.drawRect(0,0,getWidth(),getHeight(),mPaint);
}