2

Using android-event-injector library, I wrote an application to inject a touch event when some event is triggered. The problem is that i need to inject touch at absolute coordinates of a given View, so I do the following to get the location on screen:

View v = /* find view*/;
int [] coords = new int[2];
v.getLocationOnScreen(coords);

This gives me the absolute coordinates on screen. The problem is that touch injection doesn't work.

I can inject correctly touches in screen driver, but for some reason the coordinates are misunderstood and touches are injected elsewhere. Here are some examples (my screen is 1024x600 landscape oriented):

  • Coords (0,0) -> Injected in (0,0)
  • Coords (0,600) -> Injected in (0,351)
  • Coords (1024,0) -> Not injected (most likely x is out of range)
  • Coords (1024,600) -> Not injected (most likely x is out of range)
  • Coords (640,480) -> Not injected (most likely x is out of range)
  • Coords (512,300) -> Injected in (872,175)
  • Coords (100,100) -> Injected in (170,58)
Vektor88
  • 4,841
  • 11
  • 59
  • 111
  • When you try injecting touch events into the screen driver, maybe you are overlooking the screen calibration (magnitude and/or axes) which is resulting in your touch events being understood, but at the wrong on-screen co-ordinates. Enable display of pointer x,y co-ordinates in developer-options in Android settings and update your question with a few pairs of values-injected in driver and values detected on-screen(ideally anywhere in the four corners of your display). – TheCodeArtist Jul 31 '13 at 15:32
  • @TheCodeArtist I tried and added some examples. – Vektor88 Jul 31 '13 at 16:22

1 Answers1

4

Based on the sample values it appears that the

  1. Touchscreen is (600, 1024),
  2. Mapped to a (1024,600) display.

To generate a touch event at (X,Y)display co-ordinates, the (x,y)touch co-ordinates that need to be injected can be calculated as follows

x(touch) = (600/1024) * X(disp)
y(touch) = (1024/600) * Y(disp)
TheCodeArtist
  • 21,479
  • 4
  • 69
  • 130
  • Is there a way to get the display dimensions (2.) ? I mean you can get the touchscreen ones (1.) by using DisplayMetrics but how can you get the display ones programmatic? – andre Oct 24 '13 at 10:37