当然了,创建并设置好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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sQp4xGpL-1638158413811)(//upload-images.jianshu.io/upload_images/10107787-52d480772501ac3e.png?imageMogr2/auto-orient/strip|imageView2/2/w/778/format/webp)]
在后续的文章里,我将专门写一篇文章分享更多ImageView
源码的细节,感兴趣的同学点一点关注哦
3. Matrix 源码分析
从这一节开始我们来阅读Matrix
的源码,源码中出现了native
方法,这意味着Matrix
中的部分源码是在native
层实现,具体分为:Matrix.h、