系统的复习了一下ondraw绘制的基础知识,还绘制了几个图形作为练习,这篇博客记录了下常用的绘制基础方法,和两个图形demo,一个是扇形图,一个是直方图。
自定义绘制最常用的方式是重写绘制方法onDraw(),ondraw()的关键是 Canvas 的使用
Canvas分为两方面。
1,drawXXX(),关键Path,Paint。
2,辅助方法,范围裁切和几何变换。
还可以使用不同的绘制方法来控制遮盖关系
下面代码直接演示drawXXX()常用方法和Path常用方法,,因为我是边写边运行测试,试看每个方法的效果,所以都依次注释了。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//在绘制的时候,往往需要开启抗锯齿来让图形和文字的边缘更加平滑
paint.setColor(Color.BLUE);
paint.setAntiAlias(true);// 来动态开关抗锯齿
/**
* 三种模式FILL, STROKE 和 FILL_AND_STROKE 。它的默认值是 FILL,填充模式。
* FILL 是填充模式,STROKE 是画线模式(即勾边模式),FILL_AND_STROKE 是两种模式一并使用:既画线又填充。
*/
paint.setStyle(Paint.Style.FILL);//不设置默认是实心,绘制模式改为画线模式
paint.setStrokeWidth(1);
canvas.drawCircle(150, 150, 100, paint);//画圆
/**
* 重载方法 drawRect(RectF rect, Paint paint) 和 drawRect(Rect rect, Paint paint) ,
* 让你可以直接填写 RectF 或 Rect 对象来绘制矩形。
*/
canvas.drawRect(100, 100, 300, 400, paint);//画矩形
paint.setStrokeWidth(20);//点的大小
paint.setStrokeCap(Paint.Cap.ROUND);//点的形状 BUTT,SQUARE ROUND,前两参数是方的,后一个圆的
canvas.drawPoint(100, 100, paint);//画点
float[] points = {0, 0, 50, 50, 50, 100, 100, 50, 100, 100, 150, 50, 150, 100};
canvas.drawPoints(points, 2 /* 跳过两个数,即前两个 0 */, 8 /* 一共绘制 8 个数(4 个点)*/, paint); //批量花点
/**
* 重载方法 drawOval(RectF rect, Paint paint),让你可以直接填写 RectF 来绘制椭圆
*/
canvas.drawOval(100, 50, 500, 200, paint);//椭圆
canvas.drawLine(200, 200, 800, 500, paint);//画线 ,参数 分别是线的起点和终点坐标。
float[] points2 = {20, 20, 120, 20, 70, 20, 70, 120, 20, 120, 120, 120, 150, 20, 250, 20, 150, 20, 150, 120, 250, 20, 250, 120, 150, 120, 250, 120};
canvas.drawLines(points2, paint);//批量画直线
/**
* 重载方法 drawRoundRect(RectF rect, float rx, float ry, Paint paint),让你可以直接填写 RectF 来绘制圆角矩形。
*/
canvas.drawRoundRect(400, 50, 700, 200, 30, 30, paint);//画圆角矩形,四条边的坐标,rx 和 ry 是圆角的横向半径和纵向半径。
/**
* float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
* left, top, right, bottom 描述的是这个弧形所在的椭圆
* startAngle 是弧形的起始角度(x 轴的正向,即正右的方向,是 0 度的位置;顺时针为正角度,逆时针为负角度)
* sweepAngle 是弧形划过的角度
* useCenter 表示是否连接到圆心,如果不连接到圆心,就是弧形,如果连接到圆心,就是扇形
*/
canvas.drawArc(50, 0, 300, 250, 10, 260, true, paint);//绘制弧形或扇形
/**
* drawPath(Path path, Paint paint) 画自定义图形,这个方法有点复杂
* Path 可以描述直线、二次曲线、三次曲线、圆、椭圆、弧形、矩形、圆角矩形。把这些图形结合起来,就可以描述出很多复杂的图形。
*/
Path path = new Path(); // 初始化 Path 对象
// 使用 path 对图形进行描述(这段描述代码不必看懂)
path.addArc(200, 200, 400, 400, -225, 225);
path.arcTo(400, 200, 600, 400, -180, 225, false);
path.lineTo(400, 542);
canvas.drawPath(path, paint); // 绘制出 path 描述的图形(心形)
/**
* Path 有两类方法,一类是直接描述路径的,另一类是辅助的设置或计算。
* Path 方法第一类:直接描述路径,还可以细分为两组:添加子图形和画线(直线或曲线)
* 第一组: addXxx() ——添加子图形
*/
/**
*最后一个参数