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

创建矩阵之后,就可以使用Matrix提供的方法设置矩阵了,例如上面的代码在ScaleTypeScaleType.CENTER时使用setTranslate()设置为居中。

// ImageView.java

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

当然了,创建并设置好Matrix之后,再使用ImageView#setImageMatrix()设置进来也可以达到同样的效果。

步骤3:使用矩阵进行坐标变换

现在我们看使用mDrawMatrix的地方:

// ImageView.java

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 省略部分代码…
if (mDrawMatrix != null) {
// 分析点1:左乘mDrawMatrix
canvas.concat(mDrawMatrix);
}
mDrawable.draw(canvas);
}

// Canvas.java

// 分析点1:左乘mDrawMatrix
public void concat(@Nullable Matrix matrix) {
if (matrix != null) nConcat(mNativeCanvasWrapper, matrix.native_instance);
}

可以看到,ImageView#onDraw(Canvas)中对Canvas左乘mDrawMatrix,前面说到:**矩阵左乘相当于一次坐标变换。**我们通过下面一个简单的例子展示了ImageView设置Matrix前后的效果:

// 图一:未设置Matrix
iv.setBackgroundColor(0xFF999999.toInt())
iv.scaleType = ImageView.ScaleType.MATRIX
iv.setImageResource(R.color.colorAccent)

// 图二:设置Matrix,缩放到两倍
val matrix = Matrix().apply {
setScale(2F,2F)
}
iv.imageMatrix = matrix

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在后续的文章里,我将专门写一篇文章分享更多ImageView源码的细节,感兴趣的同学点一点关注哦


3. Matrix 源码分析

从这一节开始我们来阅读Matrix的源码,源码中出现了native方法,这意味着Matrix中的部分源码是在native层实现,具体分为:Matrix.h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值