Android----Matrix-与坐标变换,最新Android开发进阶

本文探讨了Android开发中Matrix类在ImageView坐标变换中的应用,从Matrix的初始化到设置矩阵,再到坐标变换的过程。作者通过分析源码揭示了Matrix在Java和native层的实现,并给出了设置Matrix实现图片居中的示例。文章还预告了后续会分享更多源码细节。
摘要由CSDN通过智能技术生成

前言

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

// 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);
}
}

可以看到,mMatrixImageView的构造器中就创建了,另外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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值