2014-06-20 79 views
0

我得到的是與WindowManager的幫助,並與這些PARAMS產生的(你可以在其他計算器問題找到)一個彈出窗口:如何在Android屏幕上拖動彈出視圖?

new WindowManager.LayoutParams(
    ViewGroup.LayoutParams.WRAP_CONTENT, 
    ViewGroup.LayoutParams.WRAP_CONTENT, 
    WindowManager.LayoutParams.TYPE_PHONE, 
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
    PixelFormat.TRANSLUCENT 
) 

我的問題是類似這樣的:Android: Drag View outside screen也類似這一個:Dragging a view outside of RelativeLayout

不同的是,該WindowManager.LayoutParams不包括任何種類的利潤率,因此不可能與相對佈局等

上的任何想法我怎麼會用醫生的保證金技巧ag的android屏幕邊界以外的視圖?

謝謝

編輯
當你問這裏是相關的代碼,不會暫時

view.setOnTouchListener(new OnTouchListener { 
    def onTouch(view: View, motionEvent: MotionEvent): Boolean = { 
    val x = motionEvent.getRawX.toInt 
    val y = motionEvent.getRawY.toInt 

    motionEvent.getAction & MotionEvent.ACTION_MASK match { 
     case MotionEvent.ACTION_DOWN => 
     val params = view.getLayoutParams.asInstanceOf[WindowManager.LayoutParams] 

     xDelta = x - params.x 

     yDelta = y - params.y 

     case MotionEvent.ACTION_UP => 
     draggingOn = false 

     case MotionEvent.ACTION_MOVE => 
     if (draggingOn) { 
      val params = view.getLayoutParams.asInstanceOf[WindowManager.LayoutParams] 

      params.x = x - xDelta 

      params.y = y - yDelta 

      //view.setLayoutParams(params) 
      windowManager.updateViewLayout(view, params) 

      //log log "current x is: " + x 

      //log log "current y is: " + y 
     } else { 
      //nop 
     } 

     case _ => 
     //case MotionEvent.ACTION_POINTER_DOWN => 
     //case MotionEvent.ACTION_POINTER_UP => 
    } 

    false 
    } 
}) 

上面的代碼中拖動是Scala,但我猜你會沒有任何硬的時間讀它

+0

有關如何將視圖拖到android屏幕邊界之外的任何想法?這是否意味着您拖動屏幕時應該水平/垂直增長? –

+0

不,不,沒什麼特別的。我只想拖動視圖,同時拖動視圖應該能夠出現在屏幕中間和屏幕中間的中間位置。目前的行爲是,視圖是有界的,不能比屏幕邊緣移動更多 –

+0

您是否使用onDrag界面拖動?請發佈您的代碼 –

回答

0

讓你拖的看法是20X20,整個屏幕是100×100。開發這種效果,你希望能在以下行來:

  1. 檢測狀態,當你拖着視圖不能包含在屏幕邊界 讓當前拖動位置(50,90),這將意味着10您的視圖單位不應該可見(垂直)。在檢測到這個時,你應該設置marginY = +10個單位。

  2. 類似地,如果將位置爲(-10,-15),這將意味着10個單位的視圖的應該是不可見(Horizo​​nally)和15個單位(垂直地)。在檢測到這個時,你應該設置marginY = -15單位和marginX = -10單位。

需要記住的是,尺寸必須是相同的單位。 希望這可以提供一些幫助。

+0

你能在你的答案中提供一些源代碼嗎?這些屬性/方法'marginX'和'marginY'屬於哪些類?我找不到像'WindowManager.LayoutParams'裏面或'View'裏面的東西。謝謝 –

+0

是的,請添加一些代碼 – Denny

0

編輯:我發現了一個簡單的解決方案: 只需撥打:

setClippingEnabled(false); 

和下面的代碼作品,未經利潤率招:

window.update(mOffsetX, mOffsetY, -1, -1, true); 

老迴應:

您不能設置屏幕外的X位置或在PopupWindow佈局參數上設置邊距。

作爲一種變通方法,我用:

case MotionEvent.ACTION_DOWN: 
    mOrgX = (int) event.getRawX(); 
    break; 

case MotionEvent.ACTION_MOVE: 
    mOffsetX = (int) event.getRawX() - mOrgX; 
    window.update(mOffsetX, mOffsetY, -1, -1, true); 

就像我說的,你不能改變PopupWindow利潤,但你可以改變的內容視圖利潤之前。

當OFFSETX比彈出的起始X位置時,我開始改變看法利潤率

if (mStartingWindowPosition + mOffsetX <= 0 
     || mWindowWith + mOffsetX > mScreenWidth) { 

    int delta = 0; 
    if (mOffsetX > 0) { 
     delta = window.getContentView().getWidth() + mOffsetX - mScreenWidth; 
    } 
    else { 
     delta = mStartingWindowPosition + mOffsetX; 
    } 
    params.rightMargin = -delta; 
    params.leftMargin = delta; 
} 

有:

if (mWindowWith == 0) { 
    mWindowWith = window.getContentView().getWidth(); 
    mStartingWindowPosition = mScreenWidth/2 - mWindowWith/2; // my window is X centered 
} 
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) window.getContentView().getLayoutParams(); 

對於我來說,它做的工作

在4.X和5.0設備上測試

注意:此代碼我現在不在生產中,所以我不知道是否有副作用