现在我们将视线回到Matrix
,Matrix
本质上是一个利用矩阵运算实现坐标变换的工具类,在Android
很多地方可以看到它的身影,我们以ImageView
为例子介绍Matrix
的使用步骤:
步骤1:创建矩阵
ImageView
对象中有两个Matrix
成员变量:mMatrix
和mDrawMatrix
,具体如下:
// ImageView.java
private Matrix mMatrix;
private Matrix mDrawMatrix;
// 在构造函数中调用
private void initImageView() {
mMatrix = new Matrix();
mScaleType = ScaleType.FIT_CENTER;
}
public void setImageMatrix(Matrix matrix) {
// 省略部分代码…
// 分析点1:参数 matrix 的值拷贝到 mMatrix
mMatrix.set(matrix);
// 分析点2:设置 mDrawMatrix
configureBounds();
// 重绘:触发onDraw(Canvas)
invalidate();
}
// Matrix.java
// 分析点1:参数 matrix 的值拷贝到 mMatrix
public void set(Matrix src) {
if (src == null) {
reset();
} else {
// native 方法
nSet(native_instance, src.native_instance);
}
}
可以看到,mMatrix
在ImageView
的构造器中就创建了,另外ImageView
还提供了setImageMatrix(Matrix)
供外部设置。那么mDrawMatrix
是在哪里创建的呢?
// ImageView.java
// 分析点2:设置 mDrawMatrix
private void configureBounds() {
// 省略部分代码…
if (ScaleType.CENTER == mScaleType) {
mDrawMatrix = mMatrix;
// 居中
mDrawMatrix.setTranslate(Math.round((vwidth - dwidth) * 0.5f),Math.round((vheight - dheight) * 0.5f));
}
// 省略部分代码…
}
configureBounds()
里有多个分支,其中有些分支里将mMatrix
赋值给mDrawMatrix
,说明两者是同一个对象。
步骤2:设置矩阵
创建矩阵之后,就可以使用Matrix
提供的方法设置矩阵了,例如上面的代码在ScaleType
为ScaleType.CENTER
时使用setTranslate()
设置为居中。
// ImageView.java
mDrawMatrix.setTranslate(Math.round((vwidth - dwidth) * 0.5f), Math.round((vheight - dheight) * 0.5f));
当然了,创建并设置好Matrix
之后,再使用ImageView