新建一个类继承自View类,在这个类中有四个构造器,我们必须重写第二个。代码如下:
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
一般画笔的初始化等造作都在第二个构造器中。
除了构造器要重写外我们还必须重写两个方法:onMeasure()
onDraw()
onMeasure()是测量宽度和高度的。在这个方法中获得View的宽度和高度。获得方法是在super()方法中复制来的。
onDraw()是受UI主线程控制的,在这个方法中进行绘制一系列的图形。
代码如下:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);//设置宽
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);//设置高
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//是由UI主线程自动调用,只需要在此绘制即可
canvas.drawLine(0,0,300,300,mPaintLine);//绘制的是线
canvas.drawCircle(300,300,100,mPaintCircle);//绘制的是圆
canvas.drawCircle(width / 2, height / 2, 200, mPaintCircle);
canvas.drawCircle(width / 2, height / 2, 10, mPaintCircle);
}
绘制任何图形都必须有画笔,画笔也是一个对象需要new,一般在有两个参数的构造器中new:
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
mCalendar=Calendar.getInstance();
mPaintLine = new Paint();
mPaintLine.setColor(Color.RED);//设置线的颜色
mPaintLine.setStrokeWidth(5);//设置线的宽度
mPaintLine.setAntiAlias(true);//设置抗锯齿
mPaintCircle = new Paint();
mPaintCircle.setColor(Color.BLUE);
mPaintCircle.setStrokeWidth(5);//设置线的宽度
mPaintCircle.setStyle(Paint.Style.STROKE);//绘制出空心圆
mPaintCircle.setAntiAlias(true);//设置抗锯齿
mPaintText = new Paint();
mPaintText.setColor(Color.BLACK);
mPaintText.setTextSize(25);//设置字体大小
mPaintText.setTextAlign(Paint.Align.CENTER);//文字居中
画布的旋转是默认是围绕坐标原点来旋转的,这里容易产生错觉,看起来觉得是图片旋转了,其实我们旋转的是画布,以后在此画布上画的东西显示出来的时候全部看起来都是旋转的。其实Roate函数有两个构造函数:
void rotate(float degrees)
void rotate (float degrees, float px, float py)
第一个构造函数直接输入旋转的度数,正数是顺时针旋转,负数指逆时针旋转,它的旋转中心点是原点(0,0)
第二个构造函数除了度数以外,还可以指定旋转的中心点坐标(px,py)
下面以第一个构造函数为例,旋转一个矩形,先画出未旋转前的图形,然后再画出旋转后的图形;
下面是一个画表盘的代码:在代码中既要画出圆,还要画出小线条和对应的时钟数
for (int i=1;i<=12;i++){
canvas.save();//保存画布当时状态
canvas.rotate(360 / 12 * i, width / 2, height / 2);//第一个参数是旋转的度数,第二、三个参数是围绕这个点旋转的坐标值
canvas.drawLine(width / 2, height / 2 - 200, width / 2, height / 2 - 180, mPaintLine);//画出小线条
canvas.drawText("" + i, width / 2, height / 2 - 150, mPaintText);//写上对应的时钟数字
canvas.restore();
}
public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
oval :指定圆弧的外轮廓矩形区域。
startAngle: 圆弧起始角度,单位为度。
sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度,从右中间开始为零度。
useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。关键是这个变量,下面将会详细介绍。
paint: 绘制圆弧的画板属性,如颜色,是否填充等。
Paint paint = new Paint();
paint.setStrokeWidth(20);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
float startAngle01 = 3;
float sweepAngle01 = 86;
RectF rect = new RectF(center - radius, center - radius, center
+ radius, center + radius);
canvas.drawArc(rect, startAngle01, sweepAngle01, true, paint);
当第4个参数为true时,绘制出的是扇形
这个参数为false时,绘制出的是弧形
drawRect(float left, float top, float right, float bottom, Paint paint)
//绘制矩形(左上右下的坐标,我们可以理解为左上的坐标为我们确定了矩形的左上角点,右下坐标为我们确定了右下角的点,这样一个矩形区域就确定出来了,paint为画笔)
drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)
//绘制圆角矩形(左上右下的坐标)
drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
//绘制弧(参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电弧,参数二是起始角(度)在电弧的开始,
参数三扫描角(度)开始顺时针测量的,参数四是如果这是真的话,包括椭圆中心的电弧,并关闭它,实际绘制的是扇形,如果它是假这将是一个弧线,参数五是Paint对象)
drawOval(float left, float top, float right, float bottom, Paint paint)
//绘制椭圆
drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
//绘制直线(XY起止坐标)
drawCircle(float cx, float cy, float radius, Paint paint)
//绘制圆形
drawText(String text, float x, float y, Paint paint)
//绘制文本
其他的不再进行列举,有需要可以查看API文档。