I think you should try Gdx.input.getX(i) and Gdx.input.getY(i)
From the Gdx.input source:
/** @return the last touch x coordinate for the first pointer in screen coordinates. The screen origin is the top left corner. */
public int getX ();
/** Returns the x coordinate in screen coordinates of the given pointer. Pointers are indexed from 0 to n. The pointer id
* identifies the order in which the fingers went down on the screen, e.g. 0 is the first finger, 1 is the second and so on.
* When two fingers are touched down and the first one is lifted the second one keeps its index. If another finger is placed on
* the touch screen the first free index will be used.
*
* @param pointer the pointer id.
* @return the x coordinate */
public int getX (int pointer);
Edit:
LibGDX supports having multiple pointers when running on a compatible device. As the documentation above states each touch is assigned the lowest available ID but retains it's ID for the duration of the touch. This can get complex when tracking more involved gestures but should be trivial when simulating buttons. I haven't heard of an android device that supports more than 10 fingers at once so I would just set the for loop to query pointer IDs 0 through 9.
It sounds like either your update loop is missing gravity & friction or your input is "sticky" (i.e. behaving like a button that is jammed down). If you add a line just before return true in isTouched(...) that prints the value of startx to the log then you will be able to see if / when it plays up.