2012-01-27 2 views
5

나는 터치 드래그에서 PopupWindow를 움직일 수 있기를 원합니다. UI가 터치의 릴리스에서 업데이트되는 것을 원하지 않습니다. 내 터치를 따라 PopupWindow 싶습니다. Android : Drag (이동)하는 방법 PopupWindow?

내가 뭐하는 거지 뭔가 :

이다 나는 팝업 창을 드래그 할 때, 앞뒤로 원래 위치 어디에 내 손가락이에 깜박 어떻게됩니까
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; 
     } 
    }); 

.

점멸 로그 캣 결과 :

내가 (주석) 제거하면
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 

그러나 "mPopupWindow.update이 (왼쪽, 위쪽, -1, -1);", 그것은 올바른 결과를 반환합니다. (그러나 분명히 UI가 업데이트되지 않습니다) :

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 

가 어떻게 올바르게 PopupWindow를 이동 것인가?

답변

4

이클립스에서 getX()에 대한 정보를 보면 첫 번째 포인터 인덱스의 getX (int)라고 표시됩니다. 나는 이것이 ACTION.DOWN에 대한 첫 번째 x와 y를 설정할 때만 사용되어야한다고 가정합니다. ACTION.MOVE, getRawX() 및 getRawY()를 사용할 때 Eclipse에 다음과 같이 표시됩니다. 화면에 이벤트의 원래 위치. 이 방법을 사용하면 팝업 창은 깜박 거리지 않고 이동 후 사라질 때까지 해당 위치에 남아 있습니다.

업데이트 코드 :

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

getX() 및 getX() 대신 getRawX() 및 getRawY()를 사용해보십시오. 다시 터치해도 조금 튀어 나오지만 움직일 때 훨씬 부드럽게 움직입니다. 더 좋은 해결책이 있다면 알려주십시오.

2

이 시도 :

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