getRawX (getRawY) issue
In sdk GetRawX (or Y) - Returns the original raw X coordinate of this event. But in this code getRawX returns me coordinates of first finger regardless if it's called in ACTION_POINTER_DOWN.
public boolean onTouchDown(MotionEvent event_) {
final int action = event_.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
if ((event_.getRawX() == event_.getX()) && event_.getRawY() == event_.getY())
_paths.put(event_.getPointerId(0), new PointerMovePath(event_.getX(), event_.getY(), event_.getPointerId(0)));
return true;
}
case MotionEvent.ACTION_POINTER_DOWN: {
int pointerIndex = (act开发者_开发技巧ion & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int pointerId = event_.getPointerId(pointerIndex);
Log.i("action_pointer_down", " getRawX: " +event_.getRawX() +" getX(index): " +event_.getX(pointerIndex));
if ((event_.getRawX() == event_.getX(pointerIndex)) && event_.getRawY() == event_.getY(pointerIndex))
_paths.put(pointerId, new PointerMovePath(event_.getX(pointerIndex), event_.getY(pointerIndex), pointerId));
return true;
}
}
return false;
}
You are not doing it correctly. The parameter to pass into "getX" and "getY" is the finger index. Pass in 0 for the first finger, 1 for the second, etc. The following is useful for dumping the relevant information in a motion event.
private void dumpEvent(MotionEvent event) {
String names[] = { "DOWN" , "UP" , "MOVE" , "CANCEL" , "OUTSIDE" ,
"POINTER_DOWN" , "POINTER_UP" , "7?" , "8?" , "9?" };
StringBuilder sb = new StringBuilder();
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
sb.append("event ACTION_" ).append(names[actionCode]);
if (actionCode == MotionEvent.ACTION_POINTER_DOWN
|| actionCode == MotionEvent.ACTION_POINTER_UP) {
sb.append("(pid " ).append(
action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append(")" );
}
sb.append("[" );
for (int i = 0; i < event.getPointerCount(); i++) {
sb.append("#" ).append(i);
sb.append("(pid " ).append(event.getPointerId(i));
sb.append(")=" ).append((int) event.getX(i));
sb.append("," ).append((int) event.getY(i));
if (i + 1 < event.getPointerCount())
sb.append(";" );
}
sb.append("]" );
Log.d(TAG, sb.toString());
}
getRawX()
and getRawY()
return the screen-relative coordinate for the same pointer that corresponds to getX()
and getY()
. To get the raw coordinates for multiple pointers you just have to calculate the offset yourself, e.g.:
float ofsX = event.getRawX() - event.getX();
float ofsY = event.getRawY() - event.getY();
for (int i = 0; i < event.getPointerCount(); i++) {
rawPosX[i] = event.getX(i) + ofsX;
rawPosY[i] = event.getY(i) + ofsY;
}
精彩评论