2014-03-02 178 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; 
} 

的問題是,這似乎只爲的Nexus 7運行在平板電腦上10英寸它不能正常工作。當我將它拖放到較大的平板電腦上時,我的手指和彈出窗口之間會有空間。所以我假設我使用的度量單位不是正確的。我試圖使用度量標準但沒有成功。誰能幫我?

+0

我看不到rootView的寬度如何有什麼用getRawX()值。這裏不應該有任何單位問題,因爲一切都在原始像素,但我不確定你的計算邏輯是否合理。 – SDJMcHattie

+0

通常,當我處理拖動對象時,我會在'MotionEvent.ACTION_DOWN'中注意觸摸的原始X和原始Y位置。同時,我注意到將要移動的視圖的原始位置。然後在'MotionEvent.ACTION_MOVE'中,我從新的X位置減去原來的X位置以獲得deltaX值。我對Y做同樣的事情來獲得deltaY。然後,我將這些添加到被移動視圖的原始位置,並獲得完美跟蹤您手指的平滑移動。 – SDJMcHattie

+0

在down動作中計算兩個deltas 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