Android----Matrix-与坐标变换

现在我们将视线回到MatrixMatrix本质上是一个利用矩阵运算实现坐标变换的工具类,在Android很多地方可以看到它的身影,我们以ImageView为例子介绍Matrix的使用步骤:

步骤1:创建矩阵

ImageView对象中有两个Matrix成员变量:mMatrixmDrawMatrix,具体如下:

// 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提供的方法设置矩阵了,例如上面的代码在ScaleTypeScaleType.CENTER时使用setTranslate()设置为居中。

// ImageView.java

mDrawMatrix.setTranslate(Math.round((vwidth - dwidth) * 0.5f), Math.round((vheight - dheight) * 0.5f));

当然了,创建并设置好Matrix之后,再使用ImageView

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值