开发者

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;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜