Android FrameLayout/View设置Matrix无变化,ImageView却正常的问题咨询
哈哈,这个坑我踩过!其实问题出在普通View(包括FrameLayout)和ImageView对Matrix的处理逻辑完全不一样,我给你拆解清楚:
首先,为啥ImageView能用Matrix?因为ImageView在它的onDraw()方法里,会主动把你设置的Matrix应用到绘制Bitmap的流程里——简单说就是系统帮你做了「把Matrix作用到画布」这一步。但普通View/FrameLayout默认的onDraw()根本不会管你设置的Matrix,你调用setMatrix()后,这个Matrix就是个摆设,没地方去生效。
那怎么解决?给你两个实用方案:
方案一:重写View/FrameLayout的onDraw,手动应用Matrix
直接在自定义的FrameLayout(或者你要用的View)里重绘时把Matrix套到Canvas上,代码示例:
public class TransformableFrameLayout extends FrameLayout { public TransformableFrameLayout(Context context) { super(context); } public TransformableFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { // 先保存画布当前状态,防止影响其他绘制内容 canvas.save(); // 将设置的Matrix应用到画布 canvas.concat(getMatrix()); // 调用父类的绘制逻辑,这样容器和子View都会跟着变换 super.onDraw(canvas); // 恢复画布状态 canvas.restore(); } }
别忘了调用setMatrix()之后,要调用invalidate()触发重绘,不然系统不知道要更新界面~
方案二:用View自带的变换方法(更简单)
如果你的需求只是缩放、平移、旋转这类常规变换,完全不用碰Matrix!View本身提供了setScaleX()、setScaleY()、setTranslationX()、setRotation()这些方法,系统会自动帮你处理变换逻辑,还不用重写onDraw,比如:
// 放大1.5倍 frameLayout.setScaleX(1.5f); frameLayout.setScaleY(1.5f); // 向右平移50px frameLayout.setTranslationX(50); // 旋转30度 frameLayout.setRotation(30);
这种方式更省心,而且系统会自动处理测量和布局的适配,不容易出问题。
最后提醒下:如果是想变换FrameLayout里的某个子View,直接给子View设置变换更合理,不用动整个容器~
内容的提问来源于stack exchange,提问作者VenkyDhana
相关产品推荐
相关产品推荐

