前言
- 首先声明,楼主不是什么大牛,没有多牛逼的技术,只是公司扩招团队,有幸作为技术面试官,面试了这么多人之后的感想,希望对大家有一点点帮助。
// 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
提供的方法设置矩阵了,例如上面的代码在Scale