마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

★★★ 액티비티나 레이아웃에서 화면 해상도에 상관없이 동일한 크기를 나타낼 수 있는 방법을 알고 싶습니다. ★★★

0 추천
안드로이드 스튜디오를 사용 중입니다.

액티비티에서 Canvas를 이용해서 drawCircle 하고

drawBitmap 등등 여러가지를 그려내고 있는데요.

 

핸드폰의 종류가 다양한 만큼 화면 해상도의 차이도

천차만별이잖아요? 그 해상도에 알맞게 대처할 수 있는

방법을 알고 싶습니다.

 

게임을 만들고 있는데, 그 게임의 등장인물들의

사이즈, 이동속도, 공격속도 같은 여러가지 요소가

핸드폰마다 너무 심한 차이를 보이는 것을 방지하려고 하는데요.

 

제 핸드폰에서는 캐릭터의 사이즈를 150으로 해놓았는데

다른 핸드폰의 150은 제 핸드폰의 150과 다르잖아요?

이것을 해결하기 위해 이런저런 방법을 찾고있는 중입니다.

 

(처음에는 그냥 화면 가로나 혹은 세로의 길이를 기준으로

잡았는데, 이 방법을 쓰면 안되는 개인적인 사정이 있습니다.)

 

제가 알아낸 방법이 하나 있긴 한데, 이 방법의 사용법이

잘못 된건지 ... 생각대로 잘 안됩니다.

 

Resources resources = this.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();

screenWidth = metrics.widthPixels / (metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
screenHeight = metrics.heightPixels / (metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);

(screenWidth는 화면 가로, screenHeight는 화면 세로)

 

Pixel 단위를 Dp 단위로 바꾸는 것이 해답이라고 하여

위와 같이 시도를 해보았는데, 위 방법이 잘못 된 건가요?

 

위 공식을 화면 가로 세로에만 적용하는 게 아니라

Canvas로 그려지는 모든 그림들에게 적용시켜야 하나요?

 

아니면 위 방법 말고 다른 방법이 또 있는지 궁금합니다.

 

그리고 액티비티 뿐만이 아니라, 레이아웃에서도

해상도 문제로 고민이네요. AndroidManifest.xml 파일에

아래와 같은 코드를 추가만 하면 해결 되는 건가요?

아니면 액티비티 상에서도 추가해야 할 코드가 있나요?

 

<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>

 

(지금 현재 RelativeLayout을 사용하고 있고, 단위는 dp를

쓰고 있으며, 뷰의 배치는 match_parent를 활용하기도 하고,

뷰나 부모의 위치를 중심으로 배치시키기도 합니다. 예를 들어

A 버튼한테서 왼쪽으로 30dp 떨어진 위치에 B 텍스트를

배치한다는 방식으로요. 문제 없을까요?)

 

질문이 길어서 죄송합니다. ㅠㅠ

 

(방법 자체도 문제지만, 그 방법의 사용법도

여기저기 다 찾아봤지만 제대로 설명해주는 곳이

딱히 없네요... 공식 하나만 딸랑 적혀있는 곳이 수두룩하고

그 공식을 어디에 어떻게 써야하는지는 안나와있고 ㅜㅜ)

 

.
abchs8wyw (1,710 포인트) 님이 2016년 12월 21일 질문
abchs8wyw님이 2016년 12월 21일 수정

1개의 답변

0 추천
제대로된 방법은 아니지만 https://developer.android.com/training/constraint-layout/index.html

제약레이아웃을 통해서 뷰의 크기를 조정할수 있습니다.

해당 비트맵을 이미지뷰로 그려서 addView하면 되겠지요.(게임용은 아니겠지만....)

게임의 경우는 안드로이드 네이티브로 개발하기보단 cocos2D를 통해 포팅한다고 알고있습니다(자세한 부분은 다음분이...)
익명사용자 님이 2016년 12월 22일 답변
...