0

내가 사용할 수 있습니다 알고에 RightTop에서 LeftBottom에 대신 LEFTTOP의 그림 :열기 PopupWindow 및 RightBottom

myPopup.showAtLocation(layout, Gravity.NO_GRAVITY, x, y); 
// OR 
myPopup.showAtLocation(layout, Gravity.TOP|Gravity.LEFT, x, y); 

는 PopupWindow의 왼쪽과 같은 [X, Y]에서 그려 PopupWindow를 열려면 , 오른쪽 아래쪽으로 그려집니다.

그러나 나는 대신에 왼쪽 아래로 그려진 PopupWindow의 오른쪽 상단으로 [x, y]에서 그려야합니다.

다음은 점이 my [x, y] 위치이고 사각형이 내 PopupWindow 인 그림입니다. 첫 번째 그림은 정상적으로 수행 된 방법을 보여주고 두 번째 그림은 달성하고자하는 것을 보여줍니다.) : enter image description here

그렇다면 검은 점의 위치를 ​​알고있는 동안 두 번째 그림의 회색 점 위치의 x와 y를 올바르게 계산하려면 어떻게해야합니까? 나는 Y는 동일하게 유지 할 수 있습니다 알고 있지만, X는 같은 것을 변경되어야합니다

  • X 마이너스 PopupWindow 폭

문제는 PopupWindow의 폭과 높이가 모두 wrap_content로 설정되어 있는지입니다 , 그래서 나는 그것을 그릴 때까지 크기를 모른다.

이것이 의미하는 바는 무엇입니까 (그러나 처음에는 보이지 않게해야 함). ViewTreeObserver의 OnGlobalLayoutListener에서 PopupWindow의 MeasuredWidth를 사용하여 새로운 x를 계산합니다 (렌더링이 완료되고 MeasuredWidth가 알려짐). 이 새로운 x를 클릭 한 다음 Visible으로 만드시겠습니까? 아니면 올바른 위치에 그릴 수있는 더 쉬운 방법이 있습니까?

PS : 나는 또한 PopupWindow가 화면 벗어나면 자동으로 (이 화면에서의 어느 측) 오른쪽/윗면의 경계에 배치되며, Gravity.TOP|Gravity.RIGHTGravity.NO_GRAVITY을 변경했습니다.

답변

0

onMeasure 팝업 창의 메서드를 재정 의하여 팝업 창의 크기를 가져올 수 있습니다.이 작업을 수행하려면보기를 하위 클래스에 추가해야합니다. 그런 다음 x 및 y 좌표의 오프셋을 계산할 수 있습니다. 희망이 도움이됩니다.

+0

비록 당신의 답변을 직접 사용하지는 않았지만 그럼에도 불구하고 그것을 받아 들일 것입니다. 내가 직접 (내 질문에 대한 대답이 아닌) 나 자신을 위해 한 해결책은 내 PopupWindow에서'android : layout_width = "match_parent"'를 사용하고 Top의 y 위치 만 사용합니다. 다른 사람이 위의 질문에서 스케치 한 것을 원한다면, @ goldenJackal의 솔루션이 자신의 확장 된 PopupWindow 클래스의 onMeasure를 재정의하는 것이 아마도 최상의 솔루션이라고 생각합니다. (ViewTreeObserver의 OnGlobalLayoutListener에 대한 제안은 다섯 가지 이상의 뷰를 측정했을 때였습니다. 하나만 있으면 onMeasure를 재정의했습니다.) –