해상도 기초 개념
공부하면서 dp, dpi, px의 개념 분야에 따라 ppi, dpi로 나뉘는 것은 알고있었지만 한부분이 애매까리했고 나중에 찾아보자 하면서 미뤄덨던 해상도 규격의 개념이 위의 블로그의 글에 의해 해결이되었다.
글을쓰면서 왜 이해를 못했던 것인가 곰곰히 생각해보니 이것 때문이였다.
해상도와 디바이스의 규격에 따라 하나의 픽셀의 크기가 결정되는데 이것을 모르고 각각의 분야마다 픽셀하나의 크기는 공통되게 쓰는줄알았던 것이다.
아우 저 블로그들 보고 기본적인 내용 정리한다고 끄적거리다가 글재주가 없어서 통으로 삭제..
갤럭시 S21 울트라 기준으로 계산해봤다.
대각선 6.8inch
1600 720
2400 1080
3200 1440 515dpi
스펙 사이트에서 515,516 둘중 하나였는데 맞았다.
그리고 시스템에서 자체적으로 설정할 수 있는 단말 해상도 세가지 모두
세로 가로 비율도 2.2222222222(20:9)비율로 맞았다.
(추가)
보니까 dpi가 1인치에 들어가는 픽셀이라서 디바이스의dpi가 화면 밀도(density인줄 알았는데)
디바이스dpi / 160dpi 가 density로 160을 1이라는 기준으로 잡는 것이였다.
px = dp * (단말 DPI/기본 160) 이 공식이 뭔가 숙지하기 어려웠는데 단말dpi/160 밀도로 치환하니 알아먹기 쉬워졌다.
px = dp * (density) // 밀도가 2로 두배 빽빽해지면 당연히 같은 공간인 dp에 두배의 픽셀이 들간다.
뷰의 크기, 마진 , 패딩 등등 dp 단위를 많이 쓰니 dp= px /density 가 많이 쓰일 것이다.
프로그래밍적으로 px를 구하기 위해서 단말의 density를 구하기 위해 단말의 dpi가 필요한데 시장의 안드로이드 디바이스 개수가 어마어마하게 많기 때문에 이를 위해 단말의 density를 제공해주는 api를 사용할 수 있다.
getResources().getDisplayMetrics().density -> 위의 공식의 density에 해당한다.
https://developer.android.com/reference/android/util/DisplayMetrics
int padding = (int) (TAB_IMAGE_VIEW_PADDING_PIV / (getResources().getDisplayMetrics().density * 2)); imageView.setPadding(padding, padding, padding, padding); 이 값을 이용해 애플리케이션 오른쪽 상단 아이콘의 image view 주변 패딩 값을 조절하는데 사용 해봤다. View 클래스의 public void setPadding 함수는 인자를 절대 수치인 pixel 단위로 값을 받기 때문에 변환된 값을 전달해야한다. 그래서 getResources().getDisplayMetrics().density 값을 나눠서 화면 스크린 화질이 좋을 수록 값이 작아지도록 변경했다. 결과 아래 그림처럼 다른 화질을 가진 환경에서도 아이콘의 크기를 맞춰줄 수 있게 됐다. 출처: https://selfish-developer.com/tag/getDisplayMetrics().density [아는 개발자] |