SelfView项目是用来提交平时感觉比较好的自定义View的。
onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法中,widthMeasureSpec和heightMeasureSpec看起来是个int值,但它也包含了View的测量模式和View的大小值。其中测量模式(用measureSpec的32位中前两位记录)有三种,三种测量模式如下:
测量模式 | 表示意思 | 对应的xml中设置尺寸 |
---|---|---|
UNSPECIFIED | 父容器没有对当前的View有任何限制,当前View可以任意取尺寸 | |
EXACTLY | 当前尺寸就是当前View应该取得尺寸 | match_parent、固定尺寸(ex:100dp) |
AT_MOST | 当前尺寸是当前View能取到的最大值 | wrap_content |
相比于自定义View,自定义ViewGroup更为复杂一些,主要是自定义ViewGroup除了绘制自己外,还得兼顾自己子View的排列。子View的排列是在onLayout方法中实现:
onLayout(boolean changed, int left, int top, int right, int bottom)
其中,changed表示该ViewGroup的大小和位置是否改变了,left表示该ViewGroup离父视图左边的距离。
注意: 当ScrollView嵌套一个自定义控件时,该控件的MeasureSpec是UNSPECIFIED,这时要记得设置控件的大小,不然控件显示不全且无法实现滚动。
canvas.drawLine(0,0,100,100,paint);
canvas没有提供专门画三角形的方法,但可以运用画多边形的方法来画三角形。画多边形方法如下:
//1.先定义一个Path对象,用来记录多边形各顶点信息
Path path = new Path();
path.moveTo(10,0);//起点位置
path.lineTo(100,100);
path.lineTo(200,150);
path.lineTo(200,100);
path.lineTo(100,50);
//path.rLineTo(100,100);
//path.rLineTo(-100,9);
path.close();//设置Path是闭合的
//2.调用canvas的drawPath方法
canvas.drawPath(path,paint);
注意: rLineTo,和lineTo基本一样,区别在于rLineTo是基于该坐标系中最后一个点。如果没有上一个点,原点(0,0)就是默认的上一个点。
1 ) 矩形
Rect rect = new Rect(0,0,100,100);
canvas.drawRect(rect,paint);
2 ) 圆角矩形
RectF rectf = new RectF(0,0,100,100);
canvas.drawRoundRect(rectf,20,10,paint);
其中
,drawRoundRect(RectF rect, float rx, float ry, Paint paint)的rx、ry表示如下:
canvas.drawCircle(50,50,40,paint);
其中,前两个参数为圆心位置,第三个参数为半径。
canvas.drawArc(rectf,0,270,true,paint);
其中,第二个参数为起始角度,第三个参数为从起始角度扫过的角度(eg:起始角度为90度,扫过为80度,那么最后的图形是90到170度之间的区域),第四个参数为是否需要带圆心
//1.先定义一个Path
Path path = new Path();
...
canvas.drawTextOnPath(String text,Path path, float hOffset,
float vOffset, Paint paint);
具体参考:Android绘图:绘制多条直线的 drawLines方法
Path中提供quadTo(二阶)、cubicTo(三阶)函数
具体参考: 安卓自定义View进阶 - 贝塞尔曲线
1)二阶
quadTo(float x1, float y1, float x2, float y2)
其中,(x1,y1)是控制点的坐标,(x2,y2)是结束点坐标。
例如:起始点分别是(50,100)、(300,150),控制点是(100,400)形成的图形如下(红色曲线):
cubicTo(float x1, float y1, float x2, float y2,float x3, float y3)
其中,(x1,y1)和(x2,y2)是控制点,(x3,y3)是结束点。
例如:在二阶基础上添加一个控制点(200,50)后形成曲线如下:
1 ) 合并两条路径时,执行的逻辑关系。其中各个枚举类型表示含义如下表(P1、P2表示两条路径区域):
逻辑关系 | 表示意思 | 对应数学含义 |
---|---|---|
DIFFERENCE | 从第一个路径减去第二个路径 | P1 - P2 |
INTERSECT | 取两个路径相交部分 | P1 ∩ P2 |
UNION | 合并两条路径区域 | P1 ∪ P2 |
XOR | 除去两条路径相交部分 | (P1 ∪ P2) - (P1 ∩ P2) |
REVERSE_DIFFERENCE | 从第二个路径减去第一个路径 | P2 - P1 |
2 ) 使用:
path1.op(path2, op);
canvas.drawPath(path1,paint);