想玩好一些自定义控件效果,什么动画,Paint,Canvas这三方面必须要学好,Paint里面的函数会分几篇博客讲解,也许讲的不太好或者有不对的地方,希望能指出来,一起学习,一起提供!
首先看下系统给Paint类都有那么函数:
先把最简单的使用函数说下:
mPaint.setColor(Color.RED);//设置画笔的颜色 mPaint.setTextSize(60);//设置文字大小 mPaint.setStrokeWidth(5);//设置画笔的宽度 mPaint.setAntiAlias(true);//设置抗锯齿功能 true表示抗锯齿 false则表示不需要这功能
上面都是很容易理解的方法,现在讲下其他重要的函数
1:paint.setStyle()设置填充样式的,它接受的形参是Style,是Paint类中的一个枚举,源码:
从图中可以看出它有三个值可以选择,写个例子直观点:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setColor(Color.RED);//设置画笔的颜色 mPaint.setTextSize(60);//设置文字大小 mPaint.setStrokeWidth(5);//设置画笔的宽度 mPaint.setAntiAlias(true);//设置抗锯齿功能 true表示抗锯齿 false则表示不需要这功能 mPaint.setStyle(Paint.Style.FILL); canvas.drawCircle(200,200,160,mPaint); mPaint.setStyle(Paint.Style.STROKE); canvas.drawCircle(600,200,160,mPaint); }我画了2个圆,只是设置了style不一样而已,效果如下:
刚说了Style枚举定义了三个值还有一个Fill_AND_STROKE我做实验发现其效果和FILL一样,具体有啥不同,不太清楚,
2:public void setShadowLayer(float radius, float dx, float dy, int shadowColor) 设置添加阴影
参数说明:
radius 表示阴影的倾斜度
dx:水平方向位移的像素
dy:垂直方向位移的像素
shadowColor:设置阴影的颜色
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setTextSize(60);//设置文字大小 mPaint.setStrokeWidth(5);//设置画笔的宽度 mPaint.setAntiAlias(true);//设置抗锯齿功能 true表示抗锯齿 false则表示不需要这功能 mPaint.setShadowLayer(10,10,10,Color.RED); canvas.drawText("杭州西湖风景真好",200,200,mPaint); }效果:
3:public void setTextAlign(Align align)//设置文字对齐方式
Align也是Paint类中定义的枚举,源码如下:
public enum Align { /** * The text is drawn to the right of the x,y origin */ LEFT (0), /** * The text is drawn centered horizontally on the x,y origin */ CENTER (1), /** * The text is drawn to the left of the x,y origin */ RIGHT (2); private Align(int nativeInt) { this.nativeInt = nativeInt; } final int nativeInt; }取值为left,right,center,刚开始以为很简单,后来写demo发现不对,经过搜索发现canvas.drawText()调用这函数没我们从字面上理解的那么简单,这会涉及到一个基线问题,记得苦逼的小时候老师叫我们写26个字母,关键是还要抄10篇,哪时候本子是四格的,要求字母不能超过这个范围否则叫我们重写,多么失败的中国教育,如图:
如果要写字母的是这样的,
其中第三个横线为基线,如图:
我们看下canvast的drawText(String text, float x, float y, Paint paint)方法四个参数代表什么意思,以前一直以为x和y是表示view所在矩形的左上角左标为原点,如图:
其实真正的原点是这个,
上面的杭 子下面做下角为原点,红色的线为基线,从图可以看出y所代表的是基线的位置,这个我们可以写个例子验证下是否正确,如果你画一条线,我们知道画一条线,需要知道二个点的坐标,然后连接起来,然后绘制一段文字,这文字的原点以所画的起点为原点,效果:
drawText出来的文字文字位置和它的绘制时设置文字的大小有关,设置的坐标以及基线有关,而基线又是和y轴坐标有关,
接着讲public void setTextAlign(Align align)这个方法我现在分别给Align的值为LEFT,CENTER,RIGHT效果分别是:
Left:
center:
right:
发现当设置center和right和我们想象的效果根本不是一回事,这到底是什么原因呢?之前一直以为绘制文字是从x轴坐标点向右开始绘制文字,通常都是这种思维,这就是drawText()方法中x坐标有关,x代表所要绘制文字所在矩形的相对位置。相对位置就是指指定点(x,y)在在所要绘制矩形的位置,这才是x坐标正确的理解其意义,可以理解x是以它所在矩形为参考物
<