2012-01-27 33 views
5

Tôi muốn có thể di chuyển PopupWindow khi kéo cảm ứng. Tôi không muốn giao diện người dùng cập nhật khi thả liên lạc. Tôi muốn PopupWindow theo dõi liên lạc của tôi.Android: Cách kéo (di chuyển) PopupWindow?

Đây là điều mà những gì tôi đang làm:

mView = mLayoutInflater.inflate(R.layout.popup, 
       null); 
mPopupWindow = new PopupWindow(mView, 
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, false); 
mPopupWindow.showAtLocation(parentView, Gravity.CENTER, -5, 30); 

mView.setOnTouchListener(new OnTouchListener() { 
     private int dx = 0; 
     private int dy = 0; 

     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      switch (motionEvent.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        dx = (int) motionEvent.getX(); 
        dy = (int) motionEvent.getY(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        int x = (int) motionEvent.getX(); 
        int y = (int) motionEvent.getY(); 
        int left = (x - dx); 
        int top = (y - dy); 
        Log.d("test", "x: " + left + " y: " + top); 
        mPopupWindow.update(left, top, -1, -1); 
        break; 
      } 
      return true; 
     } 
    }); 

gì xảy ra là, khi tôi kéo cửa sổ popup, nó thấp thoáng lui về vị trí ban đầu và nơi ngón tay của tôi.

Nhấp nháy Logcat Kết quả:

x: -44 y: 4 
x: -43 y: 37 
x: -46 y: 4 
x: -46 y: 38 
x: -48 y: 4 
x: -47 y: 38 
x: -50 y: 4 

Nhưng nếu tôi loại bỏ (nhận xét ra) "mPopupWindow.update (left, top, -1, -1);", nó sẽ trả về kết quả chính xác. (Nhưng rõ ràng giao diện người dùng sẽ không cập nhật):

x: -33 y: 0 
x: -37 y: 0 
x: -41 y: 0 
x: -43 y: 3 
x: -46 y: 3 
x: -50 y: 3 
x: -54 y: 4 
x: -57 y: 4 

Làm cách nào để di chuyển PopupWindow chính xác?

Trả lời

4

Trong nhật thực, khi xem thông tin trên getX(), nó cho biết: getX (int) cho chỉ mục con trỏ đầu tiên. Tôi giả định rằng điều này nên là chỉ được sử dụng khi thiết lập x và y đầu tiên cho ACTION.DOWN. Khi sử dụng ACTION.MOVE, getRawX() và getRawY(), eclipse cho biết: vị trí ban đầu của sự kiện trên màn hình. Sử dụng nó theo cách này, cửa sổ bật lên sẽ không nhấp nháy và sẽ vẫn ở vị trí của nó sau khi di chuyển cho đến khi nó bị loại bỏ.

đang Cập nhật:

case MotionEvent.ACTION_DOWN: 
    dx = (int) event.getX(); 
    dy = (int) event.getY(); 
    break; 

case MotionEvent.ACTION_MOVE: 
    xp = (int) event.getRawX(); 
    yp = (int) event.getRawY(); 
    sides = (xp - dx); 
    topBot = (yp - dy); 
    popup.update(sides, topBot, -1, -1, true); 
    break; 
1

Hãy thử getRawX() và getRawY() thay vì getX() và getX(). Nó vẫn bị trả lại một chút khi bạn chạm vào nó một lần nữa, nhưng nó mượt mà hơn khi di chuyển. Nếu bạn có giải pháp tốt hơn, vui lòng cho chúng tôi biết.

2

Hãy thử điều này:

mView = mLayoutInflater.inflate(R.layout.popup, 
       null); 
mPopupWindow = new PopupWindow(mView, 
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, false); 
mPopupWindow.showAtLocation(parentView, Gravity.CENTER, mPosX, mPosY); 

mView.setOnTouchListener(new OnTouchListener() { 
     private int dx = 0; 
     private int dy = 0; 

     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      switch (motionEvent.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        dx = mPosX - motionEvent.getRawX(); 
        dy = mPosY - motionEvent.getRawY(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        mPosX = (int) (motionEvent.getRawX() + dx); 
        mPosY = (int) (motionEvent.getRawY() + dy); 
        pop.update(mPosX, mPosY, -1, -1); 
        break; 
      } 
      return true; 
     } 
    }); 
Các vấn đề liên quan