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

本文探讨了Android开发中Matrix类在ImageView坐标变换中的应用,从Matrix的初始化到设置矩阵,再到坐标变换的过程。作者通过分析源码揭示了Matrix在Java和native层的实现,并给出了设置Matrix实现图片居中的示例。文章还预告了后续会分享更多源码细节。
最低0.47元/天 解锁文章
3783

被折叠的 条评论
为什么被折叠?



