세로 화면 방향으로 만 안드로이드 게임을 만들고 있습니다. 휴대 전화에서 실행할 때 훌륭하게 작동하지만 태블릿에서 실행할 때 화면 크기가 더 크더라도 모든 비트 맵의 크기가 동일합니다. 다른 크기의 화면에서도 비트 맵을 동일한 비율로 유지하는 방법이 있습니까?
세로 화면 방향으로 만 안드로이드 게임을 만들고 있습니다. 휴대 전화에서 실행할 때 훌륭하게 작동하지만 태블릿에서 실행할 때 화면 크기가 더 크더라도 모든 비트 맵의 크기가 동일합니다. 다른 크기의 화면에서도 비트 맵을 동일한 비율로 유지하는 방법이 있습니까?
답변:
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입니다.
그러나 태블릿 크기의 장치의 오른쪽 상단 모서리 만 차지하는 응용 프로그램의 원래 문제는 해결되지 않습니다. 이 질문에 답하려면 설정과 관련하여 요청한 질문에 대한 답변이 필요합니다. 나는 여기에 그것들을 빨리 요약 할 것이다 :
일반적인 의혹 : 모든 스마트 폰의 화면 크기가 같지는 않지만 실제로 화면 크기의 범위가 넓기 때문에 궁금해집니다. 화면과 다른 화면 크기의 스마트 폰에서 앱을 테스트 한 적이 있습니까? 왜냐하면-화면에 맞지만 태블릿에는 맞지 않는다는 사실 때문에 누가 치수를 언제 설정할지 궁금해합니다. 앱이 모든 스마트 폰 화면 크기에 맞출 수 있지만 태블릿 크기에는 맞지 않을 것이라는 점을 의심하기 때문에 (어떻든간에 동일한 안드로이드 코어가 실행되고 있기 때문에 sx와 3의 차이점이 있습니다.) x 및 4.x 제외) 태블릿 크기의 화면 크기를 지원하지 않는 프레임 워크를 사용하는 경우 (어떤 이유로 든 태블릿 지원을 추가로 구입해야 할 수도 있음). 그렇기 때문에 휴대 전화에서만 앱의 크기가 올바르게 조정되는지 여부를 알아야합니다. 또는 다른 스마트 폰에서도. 앱을 특정 휴대 전화의 화면 크기로 제한하는 방법을 알고있는 유일한 방법은 AbsoluteLayout과 위젯의 절대 크기를 사용하는 것입니다.
업데이트 : x / y 좌표 조정
비트 맵의 위치를 화면 크기로 조정하려면 다음과 같은 작업이 필요합니다.
이제 화면 크기를 늘리면 x / y 값을 다음과 같이 조정해야합니다.
너비와 높이가 2 씩 똑같이 증가하므로 배율은 2가됩니다. 따라서 치수는 ...
또 다른 시도-이번에는 너비 / 높이에 대해 다른 스케일 요소로
새 대상 화면이 150/250이면 계산은 다음과 같습니다.
이제 x / y 좌표를 스케일링해야하고, x는 폭 스케일을 사용하여 스케일되고 높이는 높이 스케일을 사용하여 스케일됩니다. 결과는 다음과 같습니다.
따라서 새로운 화면 크기와 배율 조정 된 x / y 좌표는 다음과 같습니다.
간단히 말해 비트 맵 크기 조정 알고리즘은 다음과 같습니다.
X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate
Android.com에는 좋은 관련 기사가 있습니다. http://developer.android.com/guide/practices/screens_support.html
이 참조는 화면 크기, 화면 밀도 및 해상도를 정렬하는 데 도움이됩니다. 목표는 Android API를 사용하여 "밀도 독립성"을 달성하여 사용자 인터페이스 구성 요소 및 그래픽이 다양한 장치에서 잘 보일 수 있도록하는 것입니다.
레이아웃과 모양을 테스트하는 동안 에뮬레이터에 대해 Android 가상 장치의 다른 구성을 만들 수도 있습니다. http://developer.android.com/guide/developing/devices/emulator.html