网络测速全解析之一:自定义View基础知识(一)
效果如图:
整个项目的Github地址
一、基础知识:
基础知识,也就是最基本的自定义view需要掌握的知识,我这里主要是学习了GcsSloop大佬的view自定义系列博客(这里是博客地址)
1.自定义view绘制流程调用链
2.android自定义坐标系(向右向下为正)
所以屏幕显示部分坐标系如下:
子控件和父控件的关系:
MotionEvent中:
getLeft、getTop、getRight、getBottom是相对于view本身距离父控件的位置。
getX和getY同理;而getRawX和getRawY则获得的是相对于屏幕默认坐标系的。
3.角度和弧度:
角度是60进制,弧度是10进制。
角度增大方向为顺时针
4.颜色:
颜色的获取方式:
Color.argb(alpha, red, green, blue);
5.分类与流程:
sloop分类方法:ViewGroup和View两类
a.view 的构造函数(四种),内部实现其实最后都会调用第四个
但是后面的两个参数一般不怎么用,一般主要用前面两个,而这两个的区别主要是调用的地方不同,目的不一样。
b.测量View的大小(onMeasure)
主要是为了取出准确的宽高值。
三种测量模式:UNSPECIFIED、EXACTLY、AT_MOST
修改view的宽高调用setMeasuredDimension方法。
c.确定view的大小(onSizeChanged)
d.View布局位置的确定(onLayout)
获得的是相对于父布局的位置信息:
e.绘制内容(onDraw):
主要使用Canvas绘制。
自定义View的整体流程:
二、Canvas绘制图形
1.Canvas常用速查表:
操作类型 | 相关API | 备注 |
绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布 |
绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 |
绘制图片 | drawBitmap, drawPicture | 绘制位图和图片 |
绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 |
绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 |
顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 |
画布剪裁 | clipPath, clipRect | 设置画布的显示区域 |
画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 |
画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 |
Matrix(矩阵) | getMatrix, setMatrix, concat | 实际上画布的位移,缩放等操作的都是图像矩阵Matrix, 只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 |
2.创建画笔:Paint
3.绘制:
点
直线
矩形
绘制一个矩形至少需要两个点,一般选择左上角和右下角的两个点。
Rect和RectF的不同之处是精度方面,Rect是int精度,RectF是float精度。
圆角矩形
后面的两个参数rx和ry是x方向和y方向的椭圆的两个半径
椭圆
原理是绘制一个矩形的内切圆形
圆
前两个是圆心坐标,第三个是半径,最后一个是画笔。
圆弧
startAngle:开始角度
sweepAngle:扫过角度
useCenter:是否使用中心(使用的话就是将圆弧两个端点和中心连接起来)
画笔Paint的三种区别:描边(STROKE)、填充(FILL)、描边加填充(FILL_ADD_STROKE)