系统通过提供Canvas对象来提供绘图方法,并且提供了绘制图像的API
例如:
drawPoint(点).drawLine(线). drawRect(矩形). drawVertices(多边形).drawArc(弧). drawCircle(圆)等等.
//获取屏幕的宽高
WindowManager wm = (WindowManager) getContext()
.getSystemService(Context.WINDOW_SERVICE);
width = wm.getDefaultDisplay().getWidth();
height = wm.getDefaultDisplay().getHeight();
Paint
作为一个非常重要的元素,功能也是很强大的以下是一些基础的属性和对应的功能
- setAntiAlias(); //设置画笔的锯齿效果
- setColor(); //设置画笔的颜色
- setARGB(); //设置画笔的A、R、G、B值
- setAlpha(); //设置画笔的Alpha值
- setTextSize(); //设置字体的尺寸
- setStyle(); //设置画笔的风格(空心或实心)
- setStrokeWidth(); //设置空心边框的宽度
- getColor(); //获取画笔的颜色
代码:
paint1 = new Paint();
paint1.setColor(Color.BLUE);
paint1.setAntiAlias(true);
//空心
paint1.setStyle(Paint.Style.STROKE);
paint2 = new Paint();
paint2.setColor(Color.GREEN);
//实心
paint2.setStyle(Paint.Style.FILL);
效果图:
Canvas
四种常用的方法
canvas.save(); //保存画布
canvas.restore(); //合并图层
canvas.translate(x,y); //画布平移到x,y处
canvas.rotate(翻转的角度,圆心的X坐标,圆心的Y坐标);//画布翻转
绘制钟表的源代码:
public class Clock extends View{
private int mWidth;
private int mHeight;
private Paint paintCircle,paintDegree;
public Clock(Context context, AttributeSet attrs) {
super(context, attrs);
WindowManager windowManager=
(WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
mHeight=windowManager.getDefaultDisplay().getHeight();
mWidth=windowManager.getDefaultDisplay().getWidth();;
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
//画圆
paintCircle=new Paint();
paintCircle.setAntiAlias(true);
paintCircle.setStyle(Paint.Style.STROKE);//设置空心
paintCircle.setStrokeWidth(5); //设置空心圆宽度
canvas.drawCircle(mWidth/2,mHeight/2,mWidth/2,paintCircle);
//画刻度
paintDegree=new Paint();
paintDegree.setAntiAlias(true);
paintDegree.setStrokeWidth(3);
//区分是否是整点
for (int i=0;i<12;i++){
//区分整点和飞整点i
if(i==0||i==3||i==6||i==9){
paintDegree.setStrokeWidth(5);
paintDegree.setTextSize(30);
canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+60,paintDegree);
String degree = String.valueOf(i);
Log.e(TAG, degree );
canvas.drawText(degree,
mWidth/2-paintDegree.measureText(degree)/2,
mHeight/2-mWidth/2+90,paintDegree);
}else {
paintDegree.setStrokeWidth(3);
canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+30,paintDegree);
}
//旋转30度
canvas.rotate(30,mWidth/2,mHeight/2);
}
//画指针
Paint paintHour=new Paint();
paintHour.setAntiAlias(true);
paintHour.setStrokeWidth(20);
Paint paintMinute=new Paint();
paintMinute.setAntiAlias(true);
paintMinute.setStrokeWidth(10);
canvas.save();
canvas.translate(mWidth/2,mHeight/2);
canvas.drawLine(0,0,100,100,paintHour);
canvas.drawLine(0,0,100,200,paintMinute);
}
}
DrawPoint 绘制点
canvas.drawPoint(x,y,paint);
DrawLine绘制直线
canvas.drawLine(startX,startY,endX,endY,paint);
绘制多条直线:
float[] pts1={startX1,startY1,endX1,endY1…startXn,startYnendXn,endYn};
canvas.drawLines(pts,paint);
DrawRect绘制矩形
canvas.drawRect(left,top,right,button,paint);
DrawRoundRect绘制圆角矩形
canvas.drawRect(left,top,right,button,radiusX,radiusY,paint);
DrawCircle绘制圆
canvas.drawCircle(圆心X坐标,Y坐标,半径,paint1);
DrawArc绘制弧形/扇形
两种写法:
第一种:canvas.drawArc(left,top,right,button, startAngle, sweepAngle, useCenter, paint2);
第二种:
RectF rectF = new RectF(left,top,right,button);
canvas.drawArc(rectF, 0, 100, true, paint2);
在这里rectF代表的是圆弧外轮扩矩形区域
startAngle表示起始的角度 (以X轴正方向为0度顺时针开始算)
sweepAngle为圆弧扫过的角度
useCenter设置为true的时候显示圆心
DrawPath绘制路径
绘制多边形
//实例化路径
Path path = new Path();
path.moveTo(80, 200);// 此点为多边形的起点
path.lineTo(120, 250);
path.lineTo(80, 250);
path.lineTo(300, 300);
//path.close(); // 使这些点构成封闭的多边形
canvas.drawPath(path, paint1);
绘制曲线:
Path path=new Path();
path.moveTo(100, 320); //设置Path的起点
path.quadTo(160,320,180,410); //设置路径点和终点
canvas.drawPath(path, paint1);
DrawOval绘制椭圆
DrawOval(left,top,right,button,paint);
RectF rectF = new RectF(210,100,250,130) ;
canvas.drawOval(rectF, paint2) ;
DrawText绘制文本
canvas.drawText(“自定义文本”,X坐标,Y坐标,paint);
绘制不同位置的文本信息
float [] pts=new float[]{100,100,200,200,300,300,400,400,500,500,600,600};
canvas.drawPosText("text",pts,paint1);
效果图:
Layer图层
重要方法:
//以下两个方法图层入栈
canvas.saveLayer();
canvas.saveLayerAlpha();
//以下两个方法图层出栈
canvas.restore();
canvas.restoreToCount();
canvas.saveLayerAlpha(0, 0,400,400,255,LAYER_TYPE_NONE);
第四个值是透明度范围在0-255之间
canvas.restore();