Android 自定义 View clipXXX() 和 Matrix 入门

学习来源扔物线大神

范围裁切

clipRect( left, top, right, bottom )

使用姿势:

1
2
3
4
canvas.save();  
canvas.clipRect(left, top, right, bottom);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();

clipPath( path )

使用姿势:

1
2
3
4
canvas.save();  
canvas.clipPath(path1);
canvas.drawBitmap(bitmap, point1.x, point1.y, paint);
canvas.restore();

几何变换

Canvas.translate(float dx, float dy) 平移

参数里的 dxdy 表示横向和纵向的位移,使用姿势:

1
2
3
4
canvas.save();  
canvas.translate(200, 0);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();

Canvas.rotate(float degrees, float px, float py) 旋转

degrees 是旋转角度,方向是顺时针为正向; pxpy 是轴心的位置

Canvas.scale(float sx, float sy, float px, float py) 缩放

sx sy 是横向和纵向的缩放倍数; px py 是缩放的轴心

skew(float sx, float sy) 错切(倾斜)

sxsy 是 x 方向和 y 方向的错切(倾斜)系数

使用 Matrix 做变换

Matrix 做常见变换的方式:

  1. 创建 Matrix 对象;
  2. 调用 Matrixpre/postTranslate/Rotate/Scale/Skew() 方法来设置几何变换;
  3. 使用 Canvas.setMatrix(matrix)Canvas.concat(matrix) 来把几何变换应用到 Canvas

Matrix 应用到 Canvas 有两个方法: Canvas.setMatrix(matrix)Canvas.concat(matrix)

  1. Canvas.setMatrix(matrix):用 Matrix 直接替换 Canvas 当前的变换矩阵,即抛弃 Canvas 当前的变换,改用 Matrix 的变换(注:不同的系统中 setMatrix(matrix) 的行为可能不一致,所以还是尽量用 concat(matrix) );
  2. Canvas.concat(matrix):用 Canvas 当前的变换矩阵和 Matrix 相乘,即基于 Canvas 当前的变换,叠加上 Matrix 中的变换

使用姿势:

1
2
3
4
5
6
7
8
9
10
Matrix matrix = new Matrix();

matrix.reset();
matrix.postTranslate();
matrix.postRotate();

canvas.save();
canvas.concat(matrix);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();
小额支持我写出更好的文章~