화면 상의 컴포넌트(뷰)들의 위치, 크기 자바로 구하기
조회수 3852회
화면상에 보이는 뷰들의 크기나 위치를 getX 등의 메소드를 통해 구할 수 있을 줄 알았는데 값들이 전부 0이 나옵니다 ㅠ 왜그런지 알 수 있을까요?
테스트는 프로젝트를 하나 생성후 Basic Activity로 생성하고 기본으로 코드가 있는 FAB를 가지고 테스트를 하였습니다.
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
ViewGroup.LayoutParams params = fab.getLayoutParams();
Log.d("test", "width : " + params.width);
Log.d("test", "height : " + params.height);
Log.d("test", "X : " + fab.getX());
Log.d("test", "Y : " + fab.getY());
Log.d("test", "Bottom : " + fab.getBottom());
Log.d("test", "Left : " + fab.getLeft());
Log.d("test", "Right : " + fab.getRight());
Log.d("test", "Top : " + fab.getTop());
Log.d("test", "TransX : " + fab.getTranslationX());
Log.d("test", "TransY : " + fab.getTranslationY());
Log.d("test", "Width : " + fab.getWidth());
Log.d("test", "Height : " + fab.getHeight());
이렇게 테스트를 하였더니 밑에처럼 결과가 나왔습니다.
05-21 01:26:37.098 2782-2782/comjongchanlee.github.testanything D/test: width : -2
05-21 01:26:37.099 2782-2782/comjongchanlee.github.testanything D/test: height : -2
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: X : 0.0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Y : 0.0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Bottom : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Left : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Right : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Top : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: TransX : 0.0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: TransY : 0.0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Width : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Height : 0
width나 height라도 나올 줄 알았으나... 이상한 값이 나오고 나머지는 전부 0이 나오네요....
왜이런 건가요?ㅠㅠ 사용을 잘못한 건가요?
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
헐.......... 자답합니다....
글을 지울 수도 있지만 혹시나 다른분들이 볼 수 도 있기에 남겨놓습니다!
저는 onCreate 안에서 구했는데
onCreate는 화면에 뷰들이 그려지기 전에 호출 되기 때문에 이때는 객체의 사이즈를 구할 수 없다고...
그래서
onWindowFocusChanged(boolean hasFocus) 안에서 구하면 된다고 하네요...
@Override public void onWindowFocusChanged(boolean hasFocus) { ViewGroup.LayoutParams params = fab.getLayoutParams(); Log.d("test", "width : " + params.width); Log.d("test", "height : " + params.height); Log.d("test", "X : " + fab.getX()); Log.d("test", "Y : " + fab.getY()); Log.d("test", "Bottom : " + fab.getBottom()); Log.d("test", "Left : " + fab.getLeft()); Log.d("test", "Right : " + fab.getRight()); Log.d("test", "Top : " + fab.getTop()); Log.d("test", "TransX : " + fab.getTranslationX()); Log.d("test", "TransY : " + fab.getTranslationY()); Log.d("test", "Width : " + fab.getWidth()); Log.d("test", "Height : " + fab.getHeight()); }
이렇게 했더니
05-21 01:46:09.581 16524-16524/comjongchanlee.github.testanything D/test: width : -2 05-21 01:46:09.581 16524-16524/comjongchanlee.github.testanything D/test: height : -2 05-21 01:46:09.581 16524-16524/comjongchanlee.github.testanything D/test: X : 864.0 05-21 01:46:09.581 16524-16524/comjongchanlee.github.testanything D/test: Y : 1560.0 05-21 01:46:09.582 16524-16524/comjongchanlee.github.testanything D/test: Bottom : 1728 05-21 01:46:09.582 16524-16524/comjongchanlee.github.testanything D/test: Left : 864 05-21 01:46:09.582 16524-16524/comjongchanlee.github.testanything D/test: Right : 1032 05-21 01:46:09.582 16524-16524/comjongchanlee.github.testanything D/test: Top : 1560 05-21 01:46:09.585 16524-16524/comjongchanlee.github.testanything D/test: TransX : 0.0 05-21 01:46:09.585 16524-16524/comjongchanlee.github.testanything D/test: TransY : 0.0 05-21 01:46:09.585 16524-16524/comjongchanlee.github.testanything D/test: Width : 168 05-21 01:46:09.585 16524-16524/comjongchanlee.github.testanything D/test: Height : 168
이렇게 나왔습니다~~
-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
더 일반적인 방법이 있는데요~
안드로이드에서 View 가 구성되는 과정에 콜백을 붙일 수 가 있거든요.
위의 경우에는
fab.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { fab.getViewTreeObserver().removeOnPreDrawListener(this); //여기서 뷰의 크기를 가져온다. return true; } });
이렇게 하면 실제 그려지기 직전에 뷰 사이즈를 다 가져올 수 있습니다.
onWindowFocusChanged 의 경우 그런 용도로 불리는건 아니라서 의도치 않게 여러번 불릴수도 있을 것 같아요!~
-
(•́ ✖ •̀)
알 수 없는 사용자 -
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
-
댓글 입력