What's the proper way to translate raw touch points to screen coordinates in MonoTouch or MonoDroid? My code works well on the emulator but the points are inaccurate on a device. Here's what I have so far:
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);
}
For MonoDroid, there are several StackOverflow Android questions which address the same topic, e.g.:
which suggests using
View.GetLocationOnScreen(int[])
orView.GetLocationInWindow()
.There is also
which also suggests using
View.GetLocationOnScreen()
along with getting the screen metrics for the default display.For Monotouch you can use ConvertPointToView which is part of all UIViews. It will convert the point to the correct coordinate for the view you pass in.