2014-03-02 2 views
0

사각형 (400dp 높이 및 400dp 너비) 인 팝업 창을 만들어야했습니다. 이제 팝업의 왼쪽 상단에있는 버튼을 탭하면 드래그하고 싶습니다. 나는 팝업에 배치 레이아웃에 onTouch()을 설정하고이 내가 드래그하기 위해 사용하는 코드입니다 :Android : 팝업 창 드래그

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    int eventAction = event.getAction(); 

    switch (eventAction) { 
     case MotionEvent.ACTION_MOVE: // Drag event 

      xRow = (int) event.getRawX() - rootView.getWidth(); 
      yRow = (int) event.getRawY() - rootView.getHeight();    

      /* Updates the position of the popup on the screen */ 
      update(xRow, yRow, -1, -1); 
      break; 
    } 

    return true; 
} 

문제를이 태블릿에서만 넥서스 7에 대한 작동하는 것 같다이다 10 인치가 제대로 작동하지 않습니다. 더 큰 태블릿으로 드래그하면 손가락과 팝업 사이에 공간이 생깁니다. 그래서 제가 사용하는 측정 단위가 올바른 단위가 아니라고 가정합니다. 통계를 사용하려고했지만 성공하지는 못했습니다. 누구든지 나를 도울 수 있습니까?

+0

내가 rootView의 폭이 getRawX() 값과 아무 상관이 볼 수 없습니다. 모든 것이 원시 픽셀이기 때문에 여기에는 단위 문제가 없어야합니다. 그러나 계산 논리가 합리적이지는 않습니다. – SDJMcHattie

+0

일반적으로 객체 드래그를 처리 할 때 'MotionEvent.ACTION_DOWN'에서 터치의 원래 X 위치와 원래 Y 위치를 기록합니다. 동시에 움직이는 뷰의 원래 위치를 기록합니다. 그런 다음'MotionEvent.ACTION_MOVE'에서 델타 X 값을 얻기 위해 새로운 X 위치에서 원래의 X 위치를 뺍니다. 저는 델타에게 Y를 받기 위해서도 똑같이합니다. 그런 다음 이동 된 뷰의 원래 위치에 이들을 추가하면 손가락을 완벽하게 추적하는 부드러운 움직임을 얻을 수 있습니다. – SDJMcHattie

+0

down 액션에서 두 델타 dx와 dy를 계산합니다 : dx = currentx - event_raw_x, dy와 동일하고 이동 작업에서 사용 new_x = event_raw_x + dx 및 new_y와 동일 – pskink

답변

13

로라,이 (에서 onCreate에 배치) 시도 :

final View cv = new View(this); 
    setContentView(cv); 

    TextView tv = new TextView(this); 
    tv.setBackgroundColor(0xffeeeeee); 
    tv.setTextColor(0xff000000); 
    tv.setTextSize(24); 
    tv.setText("click me\nthen drag me"); 
    tv.setPadding(8, 8, 8, 8); 
    mPopup = new PopupWindow(tv, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    OnTouchListener otl = new OnTouchListener() { 
     private float mDx; 
     private float mDy; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      int action = event.getAction(); 
      if (action == MotionEvent.ACTION_DOWN) { 
       mDx = mCurrentX - event.getRawX(); 
       mDy = mCurrentY - event.getRawY(); 
      } else 
      if (action == MotionEvent.ACTION_MOVE) { 
       mCurrentX = (int) (event.getRawX() + mDx); 
       mCurrentY = (int) (event.getRawY() + mDy); 
       mPopup.update(mCurrentX, mCurrentY, -1, -1); 
      } 
      return true; 
     } 
    }; 
    tv.setOnTouchListener(otl); 

    mCurrentX = 20; 
    mCurrentY = 50; 
    cv.post(new Runnable() { 
     @Override 
     public void run() { 
      mPopup.showAtLocation(cv, Gravity.NO_GRAVITY, mCurrentX, mCurrentY); 
     } 
    }); 
+0

고맙다, 아주, 매우 :) 그것은 작동한다 !! 나는 그것이 내 논리에 문제가 있다는 것을 알았지 만, 나는 그 생각에 머물렀다. 그리고 내 마음이 그것에 대해서만 생각하고있는 다른 것들을 얼마나 많이 시도했는지에 상관없이 나는 그 아이디어에 붙어 있었다. 나를 다시 깨우쳐 주셔서 감사합니다 :) – Laura

+0

나는 그게 다행 :) – pskink