直接使用Matrix与Android View内置变换方法的区别是什么
问题解答
首先明确核心结论:View的内置变换方法和直接操作Matrix、修改LayoutParams三者不是完全等价的,存在明确差异,具体细节如下:
1. 内置变换方法与直接操作Matrix的差异
View提供的setScaleX/setScaleY/setTranslationX/setRotation等内置变换方法,底层确实基于矩阵变换实现,但和开发者直接修改View的Matrix对象存在本质区别:
- 作用对象和生效逻辑不同
Android 10及以上版本中,View的变换属性直接存储在RenderNode中,绘制时由RenderThread直接组合为最终变换矩阵,不会同步修改你通过getMatrix()获取到的Matrix对象。你手动修改getMatrix()返回的Matrix,仅在重写了绘制逻辑主动应用该Matrix的自定义View场景下才会生效,原生系统组件(如TextView、ImageView)默认不会响应该修改。 - 触摸区域适配不同
内置变换方法会自动同步修改View的触摸映射逻辑,比如你调用setScaleX(2f)将View放大一倍后,整个视觉区域都可以响应触摸事件;但你手动修改Matrix后如果没有重写触摸事件的坐标映射逻辑,会出现视觉位置变化但触摸响应区域还是原来位置的问题。 - 性能差异明显
内置变换走硬件加速管线,不需要触发View的onDraw重绘,仅修改绘制结果的变换参数,性能开销极低;手动修改Matrix后通常需要调用invalidate()触发重绘才能生效,性能损耗更高。
注意:ImageView单独提供的
imageMatrix是专门用于变换内部Drawable内容的矩阵,和View本身的变换矩阵是完全独立的两个对象,不要混淆。
2. 内置变换与修改LayoutParams的差异
这两种操作的底层逻辑完全不同:
- 本质逻辑不同
修改LayoutParams的宽高参数,本质是修改View的测量尺寸,会触发父容器的onMeasure、onLayout流程重走整个布局树,是真的修改了View在布局中的实际占位;而内置变换仅修改绘制时的变换参数,View本身的测量尺寸、布局占位不会发生任何变化,只是视觉上做了拉伸、位移等效果。 - 对其他View的影响不同
修改LayoutParams会影响同容器内其他子View的布局位置,比如LinearLayout中你把第一个子View的宽度改大,后面的子View会被自动挤到右侧;而用内置变换放大View,只会视觉上覆盖相邻的View,不会改变其他View的布局位置。
内容的提问来源于stack exchange,提问作者cmak
相关产品推荐
相关产品推荐

