다양한 화면 크기에 안드로이드 게임 맞추기


11

세로 화면 방향으로 만 안드로이드 게임을 만들고 있습니다. 휴대 전화에서 실행할 때 훌륭하게 작동하지만 태블릿에서 실행할 때 화면 크기가 더 크더라도 모든 비트 맵의 ​​크기가 동일합니다. 다른 크기의 화면에서도 비트 맵을 동일한 비율로 유지하는 방법이 있습니까?

답변:


11

AbsoluteLayout을 사용하지 않는 한 (일반적으로 x / y 좌표를 사용하여 레이아웃을 디자인 할 때 설계된 장치에만 적합) 매우 나쁜 생각입니다. . 그러나 설명 (레이아웃이 테이블 화면에 조정되지 않음)에서 AbsoluteLayout이 문제가 될 수 있습니다.

레이아웃 XML 파일에서 절대 레이아웃을 사용하지 않아야합니다 (모든 종류의보기에서 명시 적 좌표 / 너비 / 높이 설정 포함). 대신 다음을 사용하십시오.

... 목적에 가장 적합한 것은 무엇이든.

Android를 처음 사용하는 경우 Google은 위에서 언급 한 다양한 레이아웃 유형을 소개 하는 훌륭한 자습서 를 제공 합니다 . 더 많은 튜토리얼은 여기 에서 찾을 수 있습니다 .

또한 API 레벨은 문제의 원인을 파악하는 데 관련이 있습니다 (Android 2.x 또는 4.x를 사용하는지 여부-스마트 폰에서는 사용할 수 없으므로 3.x는 가정하지 않습니다).

다음을 설정하여 응용 프로그램을 세로 모드로 설정하고 있습니까?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set screen orientation for this dialog to portrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

... 활동에서 게임의 뷰를 표시합니까?

뷰 레이아웃 방법에 대한 자세한 정보를 제공하십시오 (나중에 액티비티에서 팽창하는 레이아웃에 XML을 사용하고 있습니까? 또는 액티비티에서 코드 내 레이아웃을 사용하고 있습니까?)? 또한 : 스마트 폰 및 태블릿 크기의 에뮬레이터에서 앱을 실행 해 보셨습니까? 그렇다면 문제가 지속됩니까?


업데이트 : 스케일 비트 맵 방법

OP는 게임에서 사용중인 비트 맵을 어떻게 스케일링 할 수 있는지 물었습니다. 하나의 옵션 (OP의 설정에 대해 아는 모든 것) : SurfaceHolder. 게임을 표시하기 위해 재정의하고 모든 비트 맵 등을 렌더링하는 콜백은 다음과 같은 메소드가 있습니다.

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

이 방법은 표면의 너비 / 높이를 제공하므로 이제 다음을 사용할 수 있습니다.

Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)

로부터 Bitmap 클래스 . 그리는 표면의 크기에 비례하여 이미지 크기를 조정합니다.

당신이해야 할 일은 이것입니다 : 당신이 주어진 화면 크기, 예를 들어 스마트 폰의 화면 크기와 관련하여 비트 맵의 ​​크기를 알고 있다면. 그런 다음 스케일 된 비트 맵의 ​​대상 크기를 계산할 수 있습니다. 다음은 수학입니다 (예제로 래핑 됨).

크기가 100x200 (너비 x 높이) 인 화면에 표시되는 크기가 25x50 (너비 x 높이)비트 맵 A 가 있다고 가정합니다 . 해당 화면 크기 (100x200)의 경우 비트 맵의 ​​크기가 올바른 것입니다. 이제 더 큰 화면에 비트 맵을 표시하려면 다음을 수행해야합니다.

  • 비트 맵 크기의 배율을 계산합니다
  • 비트 맵의 ​​종횡비 유지 (왜곡되지 않도록)

큰 화면이 200x300 (너비 x 높이)이고 너비의 배율은 다음과 같습니다.

200(target screen width)/100(default screen width) = 2

그래서 우리가 비트 맵의 가로 세로 비율을 유지할 필요가 있기 때문에 우리의 스케일 팩터는 비트 맵의 폭과 높이 값입니다, 우리가 할 수있는 비트 맵의 폭과 높이 단순히 다중 스케일 팩터 :

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

따라서 위의 예제 비트 맵 A와 위에서 언급 한 공식을 사용하면 비트 맵의 ​​새로운 크기는 다음과 같습니다. 50x100 (widthxheight) :

 2*25(width) = 50 height
 2*50(height) = 100 height

이제 비트 맵의 ​​새로운 크기를 알았으므로 위에서 언급 한 API 호출을 사용하여 공백을 채 웁니다.

   Bitmap.createScaledBitmap (myBitmap, 50, 100, false)

위의 예제에서 myBitmap은 크기가 25x50이고 위의 코드 조각을 사용하여 50x100으로 조정 된 원래 비트 맵 A입니다.


그러나 태블릿 크기의 장치의 오른쪽 상단 모서리 만 차지하는 응용 프로그램의 원래 문제는 해결되지 않습니다. 이 질문에 답하려면 설정과 관련하여 요청한 질문에 대한 답변이 필요합니다. 나는 여기에 그것들을 빨리 요약 할 것이다 :

  • AndEngine 또는 Unity 와 같은 게임 엔진을 사용하고 있습니까?
  • XML로 레이아웃을 작성하고 있습니까? 그렇다면 게임 콘텐츠를 렌더링하기위한 루트 레이아웃은 무엇입니까?
  • SurfaceHolder.Callback을 구현한다고 언급 했습니까? surfaceChanged의 메소드 호출에 제공된 너비 / 높이는 표면의 크기를 제공합니다. 앱이 스마트 폰이나 태블릿에서 실행될 때 동일한 크기입니까?
  • SurfaceView (또는 구현중인 SurfaceHolder.Callback에 연결된 모든 항목)에 액세스 할 수 있으므로 앱 크기를 스마트 폰 크기로 엄격하게 설정했는지 확인할 수 있습니다.
  • 다른 화면 해상도로 에뮬레이터에서 동일한 크기 조정 문제가 발생합니까?

일반적인 의혹 : 모든 스마트 폰의 화면 크기가 같지는 않지만 실제로 화면 크기의 범위가 넓기 때문에 궁금해집니다. 화면과 다른 화면 크기의 스마트 폰에서 앱을 테스트 한 적이 있습니까? 왜냐하면-화면에 맞지만 태블릿에는 맞지 않는다는 사실 때문에 누가 치수를 언제 설정할지 궁금해합니다. 앱이 모든 스마트 폰 화면 크기에 맞출 수 있지만 태블릿 크기에는 맞지 않을 것이라는 점을 의심하기 때문에 (어떻든간에 동일한 안드로이드 코어가 실행되고 있기 때문에 sx와 3의 차이점이 있습니다.) x 및 4.x 제외) 태블릿 크기의 화면 크기를 지원하지 않는 프레임 워크를 사용하는 경우 (어떤 이유로 든 태블릿 지원을 추가로 구입해야 할 수도 있음). 그렇기 때문에 휴대 전화에서만 앱의 크기가 올바르게 조정되는지 여부를 알아야합니다. 또는 다른 스마트 폰에서도. 앱을 특정 휴대 전화의 화면 크기로 제한하는 방법을 알고있는 유일한 방법은 AbsoluteLayout과 위젯의 절대 크기를 사용하는 것입니다.


업데이트 : x / y 좌표 조정

비트 맵의 ​​위치를 ​​화면 크기로 조정하려면 다음과 같은 작업이 필요합니다.

  • 화면 크기 : 100/200 (너비 / 높이)
  • 비트 맵 위치 : x = 50 / y = 100

이제 화면 크기를 늘리면 x / y 값을 다음과 같이 조정해야합니다.

  • 화면 크기 : 200/400 (너비 / 높이)

너비와 높이가 2 씩 똑같이 증가하므로 배율은 2가됩니다. 따라서 치수는 ...

  • 비트 맵 위치 : x = 100 / y = 200

또 다른 시도-이번에는 너비 / 높이에 대해 다른 스케일 요소로

  • 화면 크기 : 100/150 (너비 / 높이)
  • 비트 맵 위치 : x = 50 / y = 50

새 대상 화면이 150/250이면 계산은 다음과 같습니다.

  • 너비 = targetWidth / originalWidth = 1.5의 배율
  • 높이의 배율 = targetHeight / originalHeight = 1.666 ... (기간)

이제 x / y 좌표를 스케일링해야하고, x는 폭 스케일을 사용하여 스케일되고 높이는 높이 스케일을 사용하여 스케일됩니다. 결과는 다음과 같습니다.

  • x = 원본 X * 1.5 = 75
  • y = 원본 Y * 1.666 .. (기간) = 83.333 ... (기간)

따라서 새로운 화면 크기와 배율 조정 된 x / y 좌표는 다음과 같습니다.

  • 폭 = 150
  • 높이 = 250
  • x = 75
  • y = 83,333 ... (기간)

간단히 말해 비트 맵 크기 조정 알고리즘은 다음과 같습니다.

X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate

내 게임은 SurfaceHolder.Callback을 확장하는 게임 패널을 사용합니다 (액션에서 호출하는 XML 파일에 있음). 이것이 문제의 일부일 수 있습니까?
user1404512

@ user1404512 SurfaceHolder.Callback은 일반적으로 SurfaceView에 연결되며 SurfaceView가 다른 Surface 레이아웃 (예 : FrameLayout 등)에 포함 된 경우 SurfaceView가 구성되는 방법 (너비 / 높이)에 따라 다릅니다. 방법이어야합니다 : public void surfaceChanged (SurfaceHolder holder, int format, int width, int height) 너비와 높이는 화면에 그려지는 크기이어야합니다-귀하의 경우 태블릿 및 스마트 폰에서 동일합니다- 당신은 그것을 확인?
AgentKnopf

예, 나는 이것을 말해야한다고 생각합니다 : 태블릿에서 실행할 때 화면 크기가 더 크더라도 모든 비트 맵의 ​​크기는 동일합니다. 다른 크기의 화면에서도 비트 맵을 동일한 비율로 유지하는 방법이 있습니까?
user1404512

@ user1404512 레이아웃이 어떻게 설계되는지에 대해서는 여전히 어둡기 때문에 특정 질문에 대답하기가 어렵 기 때문에 요청한 모든 질문에 답변하는 것이 매우 중요합니다. 귀하의 비트 맵에 관해서 : 귀하의 설정에 대해 알려진 것이 거의 없으므로 비트 맵 스케일링 질문에 최선의 답변을 드리기 위해 답변을 업데이트했습니다.
AgentKnopf

아니요, 게임 엔진을 사용하지 않습니다. xml에 레이아웃이 있고 xml 파일에 전체 화면 인 SurfaceHolder.Callback이 있습니다. 홀더의 너비와 높이가 화면마다 바뀝니다. 내 문제는 X 및 Y 좌표로 비트 맵을 그리는 것이지만 비트 맵의 ​​배율은 화면마다 동일하게 유지된다는 것입니다. 이 문제를 해결할 방법이 있습니까? 많은 감사드립니다!
user1404512 2016 년

3

Android.com에는 좋은 관련 기사가 있습니다. http://developer.android.com/guide/practices/screens_support.html

이 참조는 화면 크기, 화면 밀도 및 해상도를 정렬하는 데 도움이됩니다. 목표는 Android API를 사용하여 "밀도 독립성"을 달성하여 사용자 인터페이스 구성 요소 및 그래픽이 다양한 장치에서 잘 보일 수 있도록하는 것입니다.

레이아웃과 모양을 테스트하는 동안 에뮬레이터에 대해 Android 가상 장치의 다른 구성을 만들 수도 있습니다. http://developer.android.com/guide/developing/devices/emulator.html


0

어둠 속에서 한방에 부모를 세로 및 가로로 채우는 마스터 레이아웃을 설정 했습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.