Android 基础——Canvas

https://rainmonth.github.io/posts/A220131.html

自定义View永远逃不了一个话题,就时View的绘制,而View的绘制就逃不了要同今天的主角——Canvas来打交道。

Canvas控制着view绘制相关的所有调用,也就是说,view上显示的元素都需要通过Canvas调用形影的drawXX方法来绘制出来,当然要想完成View的绘制,需要一下四要素:

  1. 一个Bitmap来存储绘制的像素对象;
  2. 一个Canvas来控制draw相关方法调用(将内容像素绘制到1中的Bitmap中去);
  3. 一个基础的绘制元素(比如Rect、text、Path、Bitmap等);
  4. 用来进行绘制的画笔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 这三个值和透视有关,一般很少用到;

注意:

  1. 如果需要 通过矩阵 进行旋转造作,需要同时修改scaleX、skewX、scaleY、skewY。

  2. pre开头的表示要进行 矩阵的 左乘post开头的表示要进行 矩阵的 右乘

状态栈管理操作

clip操作

参考文章

  1. 通用功能——矩阵的操作(todo);

  2. 通用功能——Markdown常用格式说明