Android:ImageView旋转后getX()与getY()返回值的疑问
关于旋转后ImageView的getX()/getY()返回值的解释
嗨,这个问题我之前做自定义View交互的时候也踩过坑,刚好可以给你讲明白~
这些返回值到底是什么?
当你对imgv1执行旋转操作后,getX()和getY()返回的是旋转后View的轴对齐包围盒(bounding box)的左上角相对于父容器的坐标。这个包围盒是能完全容纳旋转后View视觉内容的最小矩形,而且它的边是和父容器坐标系平行的(不会跟着View旋转)。
为什么不再是原来的(x,y)?
Android中View的位置相关方法(包括getX()/getY()、getLeft()/getTop())都是基于轴对齐矩形来计算的,不会考虑View本身的旋转、倾斜等变换。当你旋转View后,它的视觉内容会偏离初始的轴对齐矩形,系统会自动计算出一个新的轴对齐包围盒来包裹住旋转后的内容,getX()/getY()就对应这个新包围盒的左上角位置,自然和初始的(x,y)不一样了。
举个你的布局例子:imgv1初始是300dp宽、200dp高,通过layout_gravity居中显示。当你旋转它90度后,视觉内容会变成竖版的200dp宽、300dp高,这时候系统生成的包围盒就是200dp×300dp的矩形,它的左上角位置会围绕原中心偏移,所以getX()和getY()的数值就会和初始值不同。
是不是返回旋转后矩形最左侧/最上方的坐标?
完全正确!你猜的没错。这个“旋转后矩形”就是刚才说的轴对齐包围盒,getX()就是这个矩形最左侧的x坐标,getY()就是这个矩形最上方的y坐标——不管View旋转多少度,这个矩形始终是和父容器坐标系平行的,所以它的边缘方向不会变。
内容的提问来源于stack exchange,提问作者TJ1
相关产品推荐
相关产品推荐

