2011-11-17 110 views
3

我目前正在嘗試在基於錨點元素的屏幕上動態地定位彈出窗口。出於某種原因,當我定位這個元素時,它在我想要的位置左側出現大約100px。例如,如果我將它放置在靠近屏幕邊緣的錨點上,彈出式窗口應該以右邊緣出現在錨點右邊的左邊。但是,彈出窗口顯示爲與屏幕邊緣齊平。如果我從計算的xPos減去100,那麼它工作正常。在Android中定位彈出窗口

我檢查了我的數學,並通過顯示代碼來檢查值是不是出現錯誤,所以我不知道是什麼導致問題。我只是在android中學習視圖,所以我確定我忽略了一些東西。希望這裏有人會知道!

我已經發布了下面的顯示代碼,如果需要,我會很高興發佈任何其他內容。

在此先感謝!

int[] location = new int[2]; 
    this.anchor.getLocationOnScreen(location); 

    Rect anchorRect = 
      new Rect(location[0], location[1], location[0] + this.anchor.getWidth(), location[1] 
       + this.anchor.getHeight()); 
    this.anchorRectangle = anchorRect; 


    this.root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    this.root.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 

    int rootWidth = this.root.getMeasuredWidth(); 
    int rootHeight = this.root.getMeasuredHeight(); 

    int screenWidth = this.windowManager.getDefaultDisplay().getWidth(); 

    int xPos, yPos; 
    // Align popup with right side if the root is wider than anchor 
    // Align with left otherwise 
    if (rootWidth > anchorRect.right - anchorRect.left) { 
     xPos = anchorRect.right - rootWidth; 
    } else { 
     xPos = anchorRect.left + 15; 
    } 

    // Correct for spilling off the edge 
    if (xPos + rootWidth > screenWidth) 
     xPos = screenWidth - rootWidth - 20; 

    // xPos = ((screenWidth - rootWidth)/2) + xOffset; 
    yPos = anchorRect.top - rootHeight + yOffset; 

    this.rootRectangle = new Rect(xPos, yPos, xPos + rootWidth, yPos + rootHeight); 

    boolean onTop = true; 
    // display on bottom 
    if(rootHeight > anchorRect.top) { 
     onTop = false; 
     yPos = anchorRect.bottom + yOffset; 
     this.window.setAnimationStyle(R.anim.grow_from_top); 
    } 

    this.window.showAtLocation(this.anchor, Gravity.NO_GRAVITY, xPos, yPos); 
+0

我通過代碼加強,希望這將有助於獲得一些數字: 屏幕寬度= 1280 XPOS = 765 rootWidth = 485(彈出窗口的視圖的寬度),所以它看起來像我應該有30像素左結束時彈出窗口,但彈出窗口顯示爲與屏幕右邊緣齊平 –

回答

3

終於找出問題所在。在上面的代碼中,我使用.measure(),然後使用.getMeasuredWidth/Height()來獲取我想要定位的視圖的度量。不幸的是,這些實際上比視圖顯示後的getWidth()和getHeight()的值小。我最終重寫了SizeChanged,以便在顯示視圖後可以跟蹤大小。一旦顯示視圖,我會抓住正確的寬度/高度並立即在正確的位置顯示彈出窗口。

希望這可以幫助別人,但我不知道爲什麼getMeasuredWidth/Height返回的值較小。

+0

哦,夥計,我完全會開始閱讀文檔的人。我很希望我知道onSizeChanged a *前一陣子! *:很長一段時間。 – samosaris

+0

嗨,你重寫onSizeChanged在哪個類? –

1

你能檢查返回的this.windowManager.getDefaultDisplay().getWidth();的值是否正確?

如果不是,它可能會在Android: Showing wrong screen resolution

嘗試增加

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" /> 

到您的清單文件是一個類似的問題作爲。

+0

是的我會檢查當我回到設備時,我假設返回的值應該等於設備的分辨率? –

+0

剛剛檢查了代碼,我確實有一個min sdk版本,是否也需要這個目標版本? –