글꼴 크기를 화면 해상도와 일치시키는 방법은 무엇입니까?


12

그래서 LibGDX를 사용하여 게임을하고 있는데 문제가 있습니다.

게임을 대부분의 해상도에 맞추기 위해 각 종횡비에 대한 기본 자산 (예 : 기본 메뉴 배경 이미지)을 만들었습니다. 4 : 3의 경우 800X600, 16 : 9의 경우 1280X720입니다.

이제 나는 TextButton옵션을 위해 게임에 s 를 통합하려고합니다 . 내 문제는 어떤 글꼴 크기가 어떤 화면 해상도와 일치하는지 알 수 없다는 것입니다. 이것을 알아낼 수있는 방법이 있습니까, 아니면 내가 가지고있는 각 해상도를 하나씩 하나씩 거쳐야하며 텍스트를 해상도와 수동으로 일치시켜야합니까?

답변:


17

쉽습니다 : 글꼴은 해상도와 일치하지 않아도되며 픽셀 밀도 와 일치해야합니다 .

픽셀 밀도는 인치당 픽셀 ( PPI ) 또는 센티미터 당 픽셀로 측정됩니다 . 밀도 독립 픽셀 ( DP ) 이라는 측정 단위도 있습니다 . 1dp한 픽셀이 160 PPI화면 에서 갖는 크기 로 정의됩니다 .

이제 글꼴로 돌아와서이 테스트를 해보십시오. 랩탑을 720p에서 실행하십시오. 글꼴 크기를 살펴보십시오. 이제 데스크탑의 1080p 42 "모니터에 연결하십시오. 모니터가 크기에 대한 올바른 정보를 출력하면 글꼴이 720p 화면에서와 정확히 같은 크기 여야합니다. 텍스트가 노트북의 크기는 데스크탑 모니터의 텍스트와 크기가 다르므로 해상도가 높을수록 글꼴에 더 자세한 내용이 표시되고 화면이 클수록 더 많은 내용이 표시됩니다.

텍스트 편집기에서도 동일한 사실을 알 수 있습니다. 72pt글꼴은 화면이 종이에 인쇄 할 때 동일에 보일 것입니다.

이 모든 것은 모든 디스플레이 크기에서 동일한 크기를 원할 것입니다 (일부 예외 제외). 당신이 어딘가에 자신을 기반으로하려는 경우, 웹 사이트는 일반적으로 12pt글꼴, MS Windows 사용 11pt12pt글꼴을 사용합니다 .

이 차트 (또한 답변의 맨 아래에 포함) 12pt는 CSS에서 CSS와 거의 동일하다는 것을 알려줍니다 16px(충분하지 않으면 CSS 의 px 는 다른 곳의 dp 와 동일 합니다). 16dpLibGDX에서 글꼴 을 만듭니다.

게임에서를 사용하여 FreeTypeFontGenerator글꼴을 동적으로 생성하십시오. 이렇게하면 글꼴을 만들 때 화면 밀도를 고려할 수 있습니다.

BitmapFont createFont(FreeTypeFontGenerator ftfg, float dp)
{
    return ftfg.generateFont((int)(dp * Gdx.graphics.getDensity()));
}
//On Init
BitmapFont buttonFont = createFont(arial, 16); //16dp == 12pt

이 작품 때문에 Gdx.graphics.getDensity()IS는에가 동일 YourScreenDensity/160하므로, 그들이 160ppi 화면에있을 것입니다 크기에 물건을 가져에 "배율 인수"입니다.

앞에서 언급 한 예외에 대해 : 로고, 프로모션 등의 경우 화면 크기에 따라 글꼴 크기를 조정하는 것이 좋습니다. 그러나 Photoshop 또는 Gimp와 같은 그래픽 편집기에서 글꼴 크기를 조정하는 것이 좋습니다. , 어쨌든.

다른 예외는 작은 화면의 텍스트입니다. 4.5 "이하 전화 화면, 웨어러블. 일반적으로 콘텐츠를 스크롤 할 시간이없는 것, 또는 그냥 화면에 너무 많은 내용을 넣어 줄 수 없습니다. 당신은 글꼴 확장을 시도 할 수 1dp는 AS, 아래로 독자는 아마도 휴대 전화를 얼굴에 아주 가까이 대면 읽기에 문제가 없을 것입니다.

TL; DR :

  • 실제 크기는 화면 크기 나 해상도에 따라 직접적으로 변경되지 않지만 두 가지 ( screenSize/resolution유명한 PPI) 의 조합으로 변경됩니다
  • ptdp 생각하십시오 . 최종 결과를 그려야 할 때까지 화면 픽셀을 잊어 버리십시오.
  • 런타임에 알맞은 크기로 글꼴을 만드십시오.
  • dp 를 화면 픽셀로 변환 :pixels = dp * Gdx.graphics.getDensity();
  • LibGDX와 같은 dp 로 변환기를 제공하지 않는 엔진을 사용하는 경우 다음을 Gdx.graphics.getDensity()시도 할 수 있습니다.densityFactor = Screen.getPixelsPerInch() / 160.0fpixels = dp * densityFactor

편집하다:

2014 년 6 월 25 일 Google IO의 Matias는 Android에 대한 새로운 스타일 가이드 라인을 발표했으며 여기에는 새로운 Roboto 글꼴 및 타이포그래피 가이드 라인이 포함되어 있습니다. 이 표를 가이드로 사용하십시오.

fron google.com/design에서 가져온 Android 글꼴 크기 가이드 라인

EDIT2 :

링크가 썩는 경우 CSS 글꼴 크기 차트가 포함되었습니다. CSS 글꼴 크기


1
+1, 좋은 답변입니다. 시거리도 매우 중요한 요소입니다. 콘솔 / TV에서 실행되는 게임의 경우 PC 또는 태블릿 (보기 거리가 매우 짧은)에 비해 더 큰 글꼴이 필요합니다.
bummzack 2016 년

1
@bummzack이 점을 지적 해 주셔서 감사합니다! 다음과 같이 수식에 스케일링 계수를 추가하면 dp * Gdx.graphics.getDensity() * distanceFactor됩니다. 2콘솔 / TV를 컴파일 할 때 distanceFactor를 일정하게 설정하고 정의 할 수 있습니다 1. 물론 더 나은 가치를 찾아야합니다.
Gustavo Maciel 2018 년

이 문제가 있습니다. SP 크기를 생성기에 픽셀 크기로 넣으면 이미지의 이미지 및 이와 관련된 다른 온라인 소스와 정확히 동일한 크기를 데스크탑 앱에서 얻습니다. getDensity() == 0.6그것들을 곱하면 데스크탑에서 읽을 수 없습니다. 그것들은 작지만`getDensity () == 3 '인 Galaxy S8에서 크기가 적당합니다. 나는 밀도를 직접 계산했으며 정확 해 보였습니다. 실제로 데스크톱 응용 프로그램 옆에 내 휴대 전화를 들고 실제로는 동일합니다. 그러나 데스크탑에서 본 실제 이미지의 크기가 아니어야합니까?
Madmenyo

@Madmenyo 그것이 내가 말한 스케일링 요소입니다. 폼 팩터가 동일한 장치에서 텍스트 크기를 동일하게 유지하려면 밀도 스케일링을 사용해야합니다. 그래서 대신의 dp * getDensity(), 당신은 아마해야 dp * getDensity() * scalingFactor하는, scalingFactor컴파일시에 결정되어야하고,이 같은 뭔가 일할 수 : 전화 : scalingFactor = 1컴퓨터 : scalingFactor = 3와 TV를 : scalingFactor = 5. 이 숫자들과 놀아보세요!
구스타보 메이 엘

GetDensity는 정확한 밀도를 반환하지 않습니다. github.com/libgdx/libgdx/issues/5322#issuecomment-406902114getPpiX() / 160) 더 나은 결과를 얻으려면 뭔가를해야합니다 . 그러나 getDensity()대부분의 경우에 충분한 추측을합니다.
Madmenyo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.