getLocationOnScreen () 대 getLocationInWindow ()
이 두 가지 방법의 맥락에서 화면과보기의 차이점은 무엇입니까?
버튼이 있고 그 중심의 x 좌표를 얻고 싶습니다.
나는 이것이 충분할 것이라고 생각한다.
public int getButtonXPosition() {
return (button.getLeft()+button.getRight())/2;
}
하지만 내가 사용했다면 어떤 차이를 만들까요?
getLocationOnScreen()
또는 getLocationInWindow()
?
(물론 버튼 너비의 절반을 추가합니다)
이 대답 이 옳지 않다고 생각 합니다. 새 프로젝트를 만들고 다음 코드 조각을 추가하여 MainActivity 만 편집하는 경우 :
public boolean dispatchTouchEvent(MotionEvent ev) {
View contentsView = findViewById(android.R.id.content);
int test1[] = new int[2];
contentsView.getLocationInWindow(test1);
int test2[] = new int[2];
contentsView.getLocationOnScreen(test2);
System.out.println(test1[1] + " " + test2[1]);
return super.dispatchTouchEvent(ev);
}
콘솔에 인쇄 된 것을 볼 수 108 108
있습니다. 4.3을 실행하는 Nexus 7을 사용하고 있습니다. 2.2까지 거슬러 올라가는 안드로이드 버전을 실행하는 에뮬레이터를 사용하여 비슷한 결과를 얻었습니다.
일반 활동 창은 WindowManager.LayoutParams로 FILL_PARENTxFILL_PARENT를 가지므로 전체 화면 크기로 레이아웃됩니다. 창은 상태 표시 줄 및 기타 장식 아래 (y 좌표가 아닌 z 순서와 관련하여)에 배치되어 있으므로보다 정확한 차트는 다음과 같습니다.
|--phone screen-----activity window---|
|--------status bar-------------------|
| |
| |
|-------------------------------------|
이 두 메서드의 소스를 단계별로 살펴보면 getLocationInWindow
뷰의 뷰 계층 구조를 RootViewImpl까지 이동하여 뷰 좌표를 합산하고 부모 스크롤 오프셋을 뺀 것을 볼 수 있습니다. 위에서 설명한 경우 ViewRootImpl은 WindowSession에서 상태 표시 줄 높이를 가져와이를 fitSystemWindows를 통해 ActionBarOverlayLayout으로 전달하여이 값을 작업 표시 줄 높이에 추가합니다. 그런 다음 ActionBarOverlayLayout은이 합산 된 값을 가져와 레이아웃의 부모 인 콘텐츠보기에 여백으로 적용합니다.
따라서 콘텐츠는 상태 표시 줄보다 낮은 y 좌표에서 시작하는 창이 아니라 활동의 콘텐츠보기에 여백이 적용된 결과로 상태 표시 줄보다 아래에 배치됩니다.
getLocationOnScreen
소스 를 들여다 보면 단순히 호출 getLocationInWindow
한 다음 Window의 왼쪽 및 상단 좌표를 추가하는 것을 볼 수 있습니다 (ViewRootImpl에 의해 View로 전달되어 WindowSession에서 가져옴). 정상적인 경우이 값은 모두 0입니다. 이러한 값이 0이 아닐 수있는 상황이 있습니다 (예 : 화면 중간에있는 대화 상자 창).
요약하면, 일반 활동의 창은 상태 표시 줄과 장식 아래의 공간까지도 전체 화면을 채 웁니다. 문제의 두 가지 방법은 동일한 x 및 y 좌표를 반환합니다. 창이 실제로 오프셋되는 대화 상자와 같은 특수한 경우에만이 두 값이 다릅니다.
getLocationOnScreen ()은 전화 화면을 기반으로 위치를 가져옵니다 .
getLocationInWindow ()는 활동 창을 기반으로 위치를 가져옵니다 .
를 들어 정상적인 활동 (안 전체 화면 활동), 아래와 같이 전화 화면 및 활동 창 관계 :
|- 전화 화면 --------------------- |
| -------- 상태 표시 줄 --------------------- |
| |
| ------------------------------------------- |
| -------- 활동 창 ------ ------- |
| |
| |
| |
| |
| |
| |
| ------------------------------------------- |
For x coordinate, the value of both method is usually same.
For y coordinate, the values have a difference for the status bar's height
The current accepted answer is a little wordy. Here is a shorter one.
getLocationOnScreen()
and getLocationInWindow()
normally return the same values. This is because the window is normally the same size as the screen. However, sometimes the window is smaller than the screen. For example, in a Dialog
or a custom system keyboard.
So if you know that the coordinates you want are always relative to the screen (like in a normal activity), then you can use getLocationOnScreen()
. However, if your view is in a Window that might be smaller than the screen (like in a Dialog or custom keyboard), then use getLocationInWindow()
.
Related
참고URL : https://stackoverflow.com/questions/17672891/getlocationonscreen-vs-getlocationinwindow
'Development Tip' 카테고리의 다른 글
Chrome 개발자 패널에 요소 선택기에 대한 키보드 단축키가 있습니까? (0) | 2020.11.23 |
---|---|
WPF 프로그래밍 방법론 (0) | 2020.11.23 |
Go를 사용하여 JSON 응답을 제공하는 방법은 무엇입니까? (0) | 2020.11.23 |
Java 8 Boolean.logicalOr 메서드 (0) | 2020.11.23 |
Psql이 서버에 연결할 수 없습니다 : 해당 파일 또는 디렉터리가 없습니다. 5432 오류? (0) | 2020.11.23 |