自定义View永远逃不了一个话题,就时View的绘制,而View的绘制就逃不了要同今天的主角——Canvas来打交道。
Canvas控制着view绘制相关的所有调用,也就是说,view上显示的元素都需要通过Canvas调用形影的drawXX方法来绘制出来,当然要想完成View的绘制,需要一下四要素:
- 一个Bitmap来存储绘制的像素对象;
- 一个Canvas来控制draw相关方法调用(将内容像素绘制到1中的Bitmap中去);
- 一个基础的绘制元素(比如Rect、text、Path、Bitmap等);
- 用来进行绘制的画笔Paint;
基本概念
绘制操作
Canvas可以通过一系列的drawXXX
方法来进行基本元素的绘制,下面进行简单说明:
- drawArc,画弧;
- drawARGB,将Canvas内部维护的multable Bitmap涂色;
- drawBitmap, 绘制Bitmap;
- drawCircle,绘制圆形;
- drawColor,以指定的混合模式为Canvas涂色(默认
SRC_OVER
混合模式); - drawline(s),绘制线段或者线段组;
- drawOval,绘制椭圆;
- drawPaint,用指定的画笔填充 Canvas内部的Bitmap,等同于用画笔绘制一个Canvas大小的矩形,但是drawPaint效率更高;
- drawPatch,绘制.9图片;
- drawPath,绘制路径,非常重要;
- drawPoint(s),绘制一个或多个点;
变换操作
Canvas的变化操作主要包括:平移、缩放、旋转、错切,分别对应一下方法:
translate(float dx, float dy)
,canvas上的对象X、Y分别都平移 dx 和 dy;scale(float sx, float sy)
,canvas上的对象X、Y分别都乘以 sx 和 sy;rotate(float degrees, float px, float py)
skew(float x, float y)
concat(Matrix matrix)
,将matrix 矩阵变换应用到 canvas的所有对象上;
这里顺便说下Matrix
Matrix
是一个3*3的矩阵(如何在Markdown中表示矩阵),
矩阵各个值的含义:
scaleX(Y)、skewX(Y)、transX(Y),分别代表X、Y轴上相应的 scale(缩放)、skew(错切)、translate(平移)操作;
persp0、persp1、persp2 这三个值和透视有关,一般很少用到;
注意:
如果需要 通过矩阵 进行旋转造作,需要同时修改scaleX、skewX、scaleY、skewY。
pre
开头的表示要进行 矩阵的 左乘,post
开头的表示要进行 矩阵的 右乘
状态栈管理操作
clip操作
参考文章
通用功能——矩阵的操作(todo);