본문 바로가기
안드로이드

[안드로이드] 커스텀 폰트 변경 (Custom Font)

by 호군 2011. 4. 5.
반응형
안드로이드사이드 사이트로부터 스크랩 한 내용입니다.
링크 : http://www.androidside.com/B46/8706

안드로이드 폰트 변경에 대해서 찾아보는데.. 바로 나오네요^^
쉽게 얻은 정보지만, 유용한 정보일 것이라 생각되어 스크랩 했습니다.




개발Q&A 에 어떤분이 올리신 질문중에
"보낸이" 가 " 보냰이" 로 나온다고 하신 분이 계서서...

http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=6088&page=2

말이 나온김에 폰트에 관련된 이야기를 나누어 볼까 합니다.

먼저 폰트의 종류부터 알아보죠

비트맵 폰트 
아주 옛날^^ 8비트 컴퓨터 시절 쓰이던 폰트죠
화면에 뿌려주는 처리속도는 매우 빠르지만 글씨의 크기가 변경 될때 이쁘게 보이질 않게 되죠
이미 크기가 정해져 비트맵으로 저장 되어 있기 때문인데요
c:\windows\fonts 에 보시면


이런 폰트들이 있으실텐데요 A 로 표시된 폰트가 비티맵 폰트입니다.




글씨가 커질수록 안 예쁘게 보여지는 단점이 있습니다.

외곽선 폰트 
컴퓨팅 기술이 발전하면서 폰트도 이쁘게 표현할 필요가 생겼는데요
벡터 그래픽이나 베지어 곡선을 폰트에 적용하면서 외곽선 폰트 형태가 생겼습니다.
이 폰트는 크기에 상관 없이 일정한 품질의 출력을 하는 장점이 있습니다.
포스트 스크립트, 트루타입, 오픈타입 폰트등이 이에 속합니다.



포스트스크립트 (Postscript)
어도비사가 개발한 포스트스크립트 폰트는 Type1,2,3 등 다양한 포맷이 있는데요 Flash 에 적용되어
있던 벡터 개념을 폰트에도 적용하여 만든 것입니다 주로 프린터에 많이 사용됩니다.

TrueType 폰트
베지에 3차곡선을 사용하는 Type1과는 달리 베지에 2차곡선을 사용하지만 이에대한 폰트의
품질 향상은 미비하지만 속도는 빠른 장점 때문에 windows 에서 많이 사용되고 있습니다.
위 그림중 "T" 자로 되어 있는 폰트입니다.

오픈타입 폰트
어도비는 M$ 와 손잡고 오픈타입 폰트라는것을 제작 하게 되는데요.
true type 폰트와 postscript 폰트를 합친 새로운 형식입니다.
유니코드에 바탕을둔 truetype 에 opentype 공통의 헤더 정보를 더하여 확장시킨 포멧입니다.
유니코드이기 때문에 안드로이드에서 이 폰트를 사용하고 있습니다.
위 그림중 "O" 자로 되어 있는 폰트입니다.


서론이 너무 길었나요?
그럼 먼저 안드로이드 기본폰트에 대해 알아보죠

1. 기본폰트 사용하기




안드로이드 기본 폰트는 위 그림과 같이
Sans , Serif  두 종류가 있구요 mono 는 각 글자의 넓이가 일정한 폰트입니다. 

layout 파일에


typeface="sans"  또는 "serif"
하시면 끝

2. 사용자폰트 사용하기


위에서 말씀드린바와 같이 windwos\fonts 에서 "O" 형태의 폰트를 고르신 후



assets\fonts\ 에 붙여넣기 합니다.

Activity onCreate 부분에



와 같이 하시면 됩니다.

실행 화면을 볼까요?





위 화면을 보신분 중 이러한 궁금증이 생기시는분이 분명 생기실껍니다.

"그럼 폰트를 일괄 적용은 못하나요?"

그래서 말씀 드리려구요.


3. Application 전체에 특정폰트 적용하기


res/values/styles.xml 에 위 내용을 입력합니다.





메니페스트 파일에 android:theme="@style/CustomTheme" 를 추가합니다.


"그러면.. Application 전체에 커스텀폰트를 적용하려면 어떻게 하나요?"

제가 알고 있는바에 따르면 현재 버전에선 불가능 한것으로 알고 있습니다. ^^;
(완전 불가능한건 아니죠 안드로이드 core 소스를 구해서
특정폰트로 교체한 후 빌드 하면 될테니까요)





위의 글은 작성자의 원문을 유지하기 위해서 수정하지 않습니다.
위에서 언급된 폰트 변경은 안드로이드에 지원한 폰트에 대해서만 변경 할 수 있습니다. 지금 할 이야기는 커스텀 폰트를 Application 전체에 적용하는 방법에 대해서 입니다. 다만 퍼블릭한 방법은 아닙니다. 그래도 이 방법은 구글이 또는 제조사에서 Public 변수를 변경하는 만행(?)을 저지르지 않는다면 유효한 방법입니다.

코드는 무척 간단합니다. AndroidManifest.xml에서 application에 GlobalApplication 클래스를 설정해주고, asset에 추가한 폰트를 읽어오시면 됩니다. 저의 경우에는 폰트가 asset/fonts/roboto/Roboto-Thin.ttf 위치에 추가한 상태입니다. 

import java.lang.reflect.Field;
import android.graphics.Typeface;

public class GlobalApplication extends Application {

  public void onCreate() {
        super.onCreate();
        initDefaultTypeface();
    }

    private void initDefaultTypeface() {
        try {
            Typeface defaultTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/roboto/Roboto-Thin.ttf");
            final Field field = Typeface.class.getDeclaredField("DEFAULT");
            field.setAccessible(true);
            field.set(null, defaultTypeface);
        } catch ( NoSuchFieldException e ) {
             e.printStackTrace();
        } catch ( IllegalArgumentException e ) {
            e.printStackTrace();
        } catch ( IllegalAccessException e ) {
            e.printStackTrace();
         }
    }
}


처음에도 언급했듯이 이 방법은 앞으로도 계속 사용 할 수 있는 방법입니다. 안드로이드가 하위 호환성을 무시하고 버전업을 하지 않는 이상은 말이죠.  

반응형