CSharp - monotouch/monodroid将原始触摸坐标转换为屏幕坐标

  显示原文与译文双语对照的内容

如何在MonoTouch或者MonoDroid中将原始触控点转换为屏幕坐标的正确方法? 我的代码在 模拟器 上运行良好,但是设备上的点不准确。 以下是我目前所拥有的内容:


 private void Initialize()
 {
 this.Touch += TouchView_Touch;
 }

 void TouchView_Touch(object sender, View.TouchEventArgs e)
 {
 e.ReturnValue = true;
 touchPoints.Add(e.Event.RawX);
 touchPoints.Add(e.Event.RawY);
 this.Invalidate();
 }

 protected override void OnDraw(Android.Graphics.Canvas canvas)
 {
 base.OnDraw(canvas);
 canvas.DrawColor(Color.White);
 Paint p = new Paint();
 p.Color = Color.Black;

 Matrix m = new Matrix();
 canvas.GetMatrix(m);
 float[] destination = touchPoints.ToArray();

 Matrix inverse = new Matrix();
 bool canInvert = m.Invert(inverse);
 inverse.MapPoints(destination);

 canvas.DrawPoints(destination, p);
 }

时间: 原作者:

对于 MonoDroid,有几个 StackOverflow Android问题可以解决同一个主题,e.g.:

如何获得视图的绝对坐标。

这意味着使用 View.GetLocationOnScreen(int[]) 或者 View.GetLocationInWindow()

还有

Android中事件坐标和视图坐标的不匹配

这也建议使用 View.GetLocationOnScreen() 以及获取默认显示的屏幕度量。

原作者:

对于 Monotouch,你可以使用 ConvertPointToView,它是所有UIViews的一部分。 它将把点转换为你所传递的视图的正确坐标。

...