想玩好一些自定义控件效果,什么动画,Paint,Canvas这三方面必须要学好,Paint里面的函数会分几篇博客讲解,也许讲的不太好或者有不对的地方,希望能指出来,一起学习,一起提供!

首先看下系统给Paint类都有那么函数:

android 公有函数 安卓函数_android怎样写函数类

android 公有函数 安卓函数_抗锯齿_02

先把最简单的使用函数说下:

mPaint.setColor(Color.RED);//设置画笔的颜色mPaint.setTextSize(60);//设置文字大小mPaint.setStrokeWidth(5);//设置画笔的宽度mPaint.setAntiAlias(true);//设置抗锯齿功能true表示抗锯齿false则表示不需要这功能

上面都是很容易理解的方法,现在讲下其他重要的函数

1:paint.setStyle()设置填充样式的,它接受的形参是Style,是Paint类中的一个枚举,源码:

android 公有函数 安卓函数_android 公有函数_03

从图中可以看出它有三个值可以选择,写个例子直观点:

@Overrideprotected voidonDraw(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不一样而已,效果如下:

android 公有函数 安卓函数_android 公有函数_04

刚说了Style枚举定义了三个值还有一个Fill_AND_STROKE我做实验发现其效果和FILL一样,具体有啥不同,不太清楚,

2:public void setShadowLayer(float radius, float dx, float dy, int shadowColor) 设置添加阴影

参数说明:

radius 表示阴影的倾斜度

dx:水平方向位移的像素

dy:垂直方向位移的像素

shadowColor:设置阴影的颜色

@Overrideprotected voidonDraw(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);} 效果:

android 公有函数 安卓函数_android怎样写函数类_05

3:public void setTextAlign(Align align)//设置文字对齐方式

Align也是Paint类中定义的枚举,源码如下:

public enumAlign {
/*** 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);privateAlign(intnativeInt) {
this.nativeInt= nativeInt;}

final intnativeInt;} 取值为left,right,center,刚开始以为很简单,后来写demo发现不对,经过搜索发现canvas.drawText()调用这函数没我们从字面上理解的那么简单,这会涉及到一个基线问题,记得苦逼的小时候老师叫我们写26个字母,关键是还要抄10篇,哪时候本子是四格的,要求字母不能超过这个范围否则叫我们重写,多么失败的中国教育,如图:

android 公有函数 安卓函数_ide_06

如果要写字母的是这样的,

android 公有函数 安卓函数_基线_07

其中第三个横线为基线,如图:

android 公有函数 安卓函数_android怎样写函数类_08

我们看下canvast的drawText(String text, float x, float y, Paint paint)方法四个参数代表什么意思,以前一直以为x和y是表示view所在矩形的左上角左标为原点,如图:

android 公有函数 安卓函数_android怎样写函数类_09

其实真正的原点是这个,

android 公有函数 安卓函数_ide_10

上面的杭 子下面做下角为原点,红色的线为基线,从图可以看出y所代表的是基线的位置,这个我们可以写个例子验证下是否正确,如果你画一条线,我们知道画一条线,需要知道二个点的坐标,然后连接起来,然后绘制一段文字,这文字的原点以所画的起点为原点,效果:

android 公有函数 安卓函数_android 公有函数_11

drawText出来的文字文字位置和它的绘制时设置文字的大小有关,设置的坐标以及基线有关,而基线又是和y轴坐标有关,

接着讲public void setTextAlign(Align align)这个方法我现在分别给Align的值为LEFT,CENTER,RIGHT效果分别是:

Left:

android 公有函数 安卓函数_基线_12

center:

android 公有函数 安卓函数_抗锯齿_13

right:

android 公有函数 安卓函数_android怎样写函数类_14

发现当设置center和right和我们想象的效果根本不是一回事,这到底是什么原因呢?之前一直以为绘制文字是从x轴坐标点向右开始绘制文字,通常都是这种思维,这就是drawText()方法中x坐标有关,x代表所要绘制文字所在矩形的相对位置。相对位置就是指指定点(x,y)在在所要绘制矩形的位置,这才是x坐标正确的理解其意义,可以理解x是以它所在矩形为参考物

android 公有函数 安卓函数_抗锯齿_15

上面长方形也就是文字所绘制的矩形,现在用图来直观的看下刚才设置left,center,right

android 公有函数 安卓函数_基线_16

上面是以设置left为标准,然后设置center和right可以把left这个为标准,就可以看出来效果了,再补充一点如果起点不是从0开始的话,在设置center和right的时候,要向右移动x所给的值距离,比如我起点是从100开始,

@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);intbaseLineX = 100;intbaseLineY = 200;mPaint.setStrokeWidth(10);//画基线mPaint.setColor(Color.BLUE);canvas.drawLine(baseLineX,baseLineY,1080,baseLineY,mPaint);//写文字mPaint.setColor(Color.RED);mPaint.setTextSize(90);mPaint.setTextAlign(Paint.Align.RIGHT);canvas.drawText("杭州西湖风景真好",baseLineX,baseLineY,mPaint);} 我设置的是right,效果:

android 公有函数 安卓函数_android怎样写函数类_17

如果baseLineX为0就是刚好什么都看不见,但是现在的baseLineX为100,就相当于那个绘制的矩形向右移动100px,就看见一个好字了,好了这个方法讲到这里,真累

4:public native void setAlpha(int a)//设置透明都

@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setTextSize(90);canvas.drawText("杭州西湖风景真美",0,300,mPaint);mPaint.setAlpha(100);canvas.drawText("杭州西湖风景真美",0,500,mPaint);} 绘制了二段一样的文字对比下效果:

android 公有函数 安卓函数_android怎样写函数类_18

5:public native void setTextScaleX(float scaleX)设置水平位置拉伸

@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setTextSize(90);mPaint.setTextScaleX(1.2f);canvas.drawText("杭州西湖风景真美",0,300,mPaint);} 效果:

android 公有函数 安卓函数_android怎样写函数类_19

6:public native void setFakeBoldText(boolean fakeBoldText);设置文字是否为粗体

@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setTextSize(90);mPaint.setFakeBoldText(true);canvas.drawText("杭州西湖风景真美",0,300,mPaint);} 效果:

android 公有函数 安卓函数_ide_20

7:public native void setStrikeThruText(boolean strikeThruText);设置是否带有删除线效果

@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setTextSize(90);mPaint.setStrikeThruText(true);canvas.drawText("杭州西湖风景真美",0,300,mPaint);} 效果:

android 公有函数 安卓函数_基线_21

8:public native void setUnderlineText(boolean underlineText);是否设置下划线

@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setTextSize(90);mPaint.setUnderlineText(true);canvas.drawText("杭州西湖风景真美",0,300,mPaint);} 效果:

android 公有函数 安卓函数_基线_22

9: /**

* Set the paint's horizontal skew factor for text. The default value
* is 0. For approximating oblique text, use values around -0.25.
*
* @param skewX set the paint's skew factor in X for drawing text.
*/public native void setTextSkewX(float skewX);设置字体水平倾斜度,上面的注释表明默认为-0.25
@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setTextSize(90);mPaint.setTextSkewX(-0.5f);canvas.drawText("杭州西湖风景真美",0,300,mPaint);}
效果:

android 公有函数 安卓函数_基线_23

10:public Typeface setTypeface(Typeface typeface);设置字体样式

它有四种取值

public static final intNORMAL= 0;public static final intBOLD= 1;public static final intITALIC= 2;public static final intBOLD_ITALIC= 3; 除了使用过系统默认的字体,也可以自己自定义字体,比如你可以用小米或者其他手机它的字体取出来放在assets文件夹下然后加载进去

Typeface类提供了几个重载的创建自定义字体的方法:

android 公有函数 安卓函数_基线_24

Typefacecreate(String familyName, int style) //直接通过指定字体名来加载系统中自带的文字样式
create(Typeface family, int style)     //通过其它Typeface变量来构建文字样式
createFromAsset(AssetManager mgr, String path) //通过从Asset中获取外部字体来显示字体样式
createFromFile(String path)//直接从路径创建
createFromFile(File path)//从外部路径来创建字体样式
defaultFromStyle(int style)//创建默认字体
@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setTextSize(90);Typeface typeFace = Typeface.defaultFromStyle(Typeface.BOLD);mPaint.setTypeface(typeFace);canvas.drawText("杭州西湖风景真美",0,300,mPaint);} 效果:
11: public PathEffect setPathEffect(PathEffect effect)设置路径样式,我们看见要传递的参数Patheffect,
public classPathEffect {
protected voidfinalize() throwsThrowable {
nativeDestructor(native_instance);}
private static native voidnativeDestructor(longnative_patheffect);longnative_instance;} 发现PathEffect就这个方法,这说明肯定有它子类,ctrl+T,查看下它的类结构:

android 公有函数 安卓函数_android 公有函数_25

发现它有6个子类,有时间继续!