Xamarin Native(非Forms)中如何获取RelativeLayout内ImageView的屏幕绝对位置?
好问题!在Xamarin Native(不管你用的是Android还是iOS平台)里,确实没法直接套用Xamarin.Forms那套遍历父布局累加坐标的思路——毕竟Native是直接对接原生平台API的,每个平台都有更直接的原生方法来获取View相对于屏幕的绝对位置,下面分平台给你具体说明:
Android平台解决方案
在Xamarin.Android中,你可以使用GetLocationOnScreen()或者GetLocationInWindow()这两个原生方法,两者的核心区别在于:
GetLocationOnScreen():获取的是View相对于整个屏幕的坐标(包含状态栏的高度)GetLocationInWindow():获取的是View相对于当前应用窗口的坐标(不包含状态栏,如果你的Activity是全屏模式,两者结果一致)
具体代码示例:
// 创建一个int数组,用来存储最终的坐标(索引0是X值,索引1是Y值) int[] screenLocation = new int[2]; // 调用方法填充坐标数组 yourImageView.GetLocationOnScreen(screenLocation); // 提取绝对坐标 int absoluteX = screenLocation[0]; int absoluteY = screenLocation[1];
重要提示:这个方法必须在View完成绘制之后调用,不然会获取到无效的0值。如果你的代码是在OnCreate()里执行的,可以用Post()延迟到View绘制完成后再执行:
yourImageView.Post(() => { int[] screenLocation = new int[2]; yourImageView.GetLocationOnScreen(screenLocation); // 在这里处理获取到的绝对坐标 });
iOS平台解决方案
在Xamarin.iOS中,你可以使用ConvertPointToView()方法,把View相对于父布局的坐标转换为相对于屏幕(即应用的主Window)的绝对坐标。
具体代码示例:
// 获取ImageView相对于父布局的原点坐标 CGPoint relativeOrigin = yourImageView.Frame.Location; // 转换为相对于主Window的绝对坐标(第二个参数传null代表转换到Window层面) CGPoint absolutePoint = yourImageView.ConvertPointToView(relativeOrigin, null); // 提取绝对坐标 nfloat absoluteX = absolutePoint.X; nfloat absoluteY = absolutePoint.Y;
你也可以用更简洁的写法,直接把View的原点(相对于自身)转换到Window层面:
CGPoint absolutePoint = yourImageView.ConvertPointToView(CGPoint.Zero, UIApplication.SharedApplication.KeyWindow);
同样要注意:务必在View完成布局加载后调用,比如在ViewDidAppear()生命周期方法里,而不是ViewDidLoad()——因为ViewDidLoad时View还没完成屏幕布局,获取到的坐标会不准确。
内容的提问来源于stack exchange,提问作者Asaf
相关产品推荐
相关产品推荐

