Android----Matrix-与坐标变换,熬夜整理Android高频面试题

本文深入探讨 Android 中 Matrix 类如何进行坐标变换,通过分析 `onDraw` 方法中 Canvas 的矩阵操作,揭示 Matrix 的工作原理。接着,详细解读 Matrix 的 Java 和 native 层初始化过程,以及 set、preScale 和 postScale 方法的差异,展示 SkMatrix 的核心功能。
摘要由CSDN通过智能技术生成

当然了,创建并设置好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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值