一直以来都想研究自定义View,但是总是遇到这样那样的原因。今天理清思路,从零开始,一起学习,共同完成一个小demo。
准备:想自己画出想要的控件,有些类必须了解----------Paint(画笔),Canvas(画布),View(视图)。
View
invalidate();
onDraw(Canvas canvas)
此方法为我们提供了一个Canvas对象,我们可以在这里绘制图案等。
onMeasure (int widthMeasureSpec, int heightMeasureSpec)
onLayout(boolean changed, int left, int top, int right, int bottom)
此方法在控件需要给子控件分配大小和位置时会调用,当然一般也是在类型为ViewGroup的时候会重写这个。
Paint,Canvas
这两个放在一块是因为,二者密不可分。在onRraw方法中,提供了一个Canvas对象,一般来说Canvas中可以画点,画线,画各种图形,文字,图片。
Paint控制了如何画,即:颜色,透明度,抗锯齿,实心还是空心等等
Canvas控制了画什么,即:drawLine,drawArc,drawBitmap,drawText,drawRect,drawPath等等,太多,就一一不说了,每个方法都被重载了很多种,可以传入不同的参数,达到想要的效果,可以说条条大路通罗马。
这里说几个特殊的:
1、画多边形drawPath,别的不说啦,先上两个小图片,看看。挺好玩的,喜欢研究的可以研究研究。
代码如下:
private void drawPath(Canvas canvas) {
Paint p = new Paint();
p.setAntiAlias(true);
p.setStyle(Style.STROKE);//空心
//p.setStyle(Style.FILL);//实心
p.setColor(Color.GREEN);
Path path = new Path();
path.moveTo(80, 340);
path.lineTo(200, 500);
path.lineTo(20, 400);
path.lineTo(80, 500);
path.lineTo(200, 500);
path.lineTo(80, 600);
path.close();
canvas.drawPath(path, p);
}
2、画图形,圆弧,圆,矩形等,这里以矩形为例,老规矩先上图
这里的四个矩形,都是等长等高的,不难看出不同所在。风格以及实际大小。代码如下:
/**
* 画矩形,实心&空心
*
* @param canvas
*/
private void drawRect(Canvas canvas) {
//Style为FILL_AND_STROKE的矩形
Paint paint1 = new Paint();
paint1.setAntiAlias(true);
paint1.setColor(Color.BLUE);
paint1.setStyle(Style.FILL_AND_STROKE);
canvas.drawRect(20, 20, 100, 100, paint1);
//Style为STROKE的矩形
Paint paint2 = new Paint();
paint2.setAntiAlias(true);
paint2.setColor(Color.BLUE);
paint2.setStyle(Style.STROKE);
canvas.drawRect(120, 20, 200, 100, paint2);
//设置了StrokeWidth,Style为STROKE矩形
Paint paint3 = new Paint();
paint3.setAntiAlias(true);
paint3.setColor(Color.BLUE);
paint3.setStyle(Style.STROKE);
paint3.setStrokeWidth(10);
canvas.drawRect(220, 20, 300, 100, paint3);
//Style为FILL的矩形
Paint paint4 = new Paint();
paint4.setAntiAlias(true);
paint4.setColor(Color.BLUE);
paint4.setStyle(Style.FILL);
canvas.drawRect(320, 20, 400, 100, paint4);
}
3、画文字,拿一个方法吧,说说其参数,不过还是先上图
这个有点特殊,上代码前我先啰嗦两句。
canvas.drawText(String text, float x, float y,Paint paint)
参数:
text:需要绘制的文本
x:文字的起始位置,但同样是一个基准位置,若是设置文字的TextAlign,则以此为基准(可看上图的3,4,5)。
y:文字的基准线,这里强调这个基准线不是下边线,如图,写英文的时候字母都会按照基准线排列,图上很清楚了。
paint:就是画笔,这里不多说。
/**
* 画文字
*
* @param canvas
*/
private void drawText(Canvas canvas) {
//绘制“Google,Android”
Paint paint1 = new Paint();
paint1.setAntiAlias(true);
paint1.setColor(Color.GREEN);
paint1.setTextSize(24);
canvas.drawText("Google,Android", 200, 200, paint1);
//绘制“Google,Android”,透明度设为100
Paint paint2 = new Paint();
paint2.setAntiAlias(true);
paint2.setColor(Color.GREEN);
paint2.setTextSize(24);
//透明度有效范围 0-255
paint2.setAlpha(100);
canvas.drawText("Google,Android", 200, 230, paint2);
<span style="white-space:pre"> </span>//绘制居左的“Google,Android”
Paint paint3 = new Paint();
paint3.setAntiAlias(true);
paint3.setColor(Color.GREEN);
paint3.setTextSize(24);
paint3.setTextAlign(Align.LEFT);
canvas.drawText("Google,Android", 200, 260, paint3);
//绘制居中的“Google,Android”
Paint paint4 = new Paint();
paint4.setAntiAlias(true);
paint4.setColor(Color.GREEN);
paint4.setTextSize(24);
paint4.setTextAlign(Align.CENTER);
canvas.drawText("Google,Android", 200, 290, paint4);
//绘制居右的“Google,Android”
Paint paint5 = new Paint();
paint5.setAntiAlias(true);
paint5.setColor(Color.GREEN);
paint5.setTextSize(24);
paint5.setTextAlign(Align.RIGHT);
canvas.drawText("Google,Android", 200, 320, paint5);
}
OK,基本的就是这样,根据这些,下一篇写一个类似于幸运转盘的效果。
44万+

被折叠的 条评论
为什么被折叠?



