안드로이드

[android] webview font assets load(assets에 있는 font 자원을 읽어서 웹서버에서 내려받는 자원 아끼는 방법)

IT꿈나무 2023. 8. 30. 11:40
반응형

서버에서 폰트를 내려 받으면 자원을 내려 받기 때문에 비용이 많이 발생할수 있다.
따라서 자원을 아끼기 위해서, 네이티브에 자원을 넣고 그 자원을 읽어 들여 자원을 아끼는 방법을 고려해 볼 필요가 있다.
아래의 방법을 통해서 안드로이드의 assets에 폰트 자원을 넣어 놓고 웹뷰에 로드하여 폰트를 읽을 수 있다.


import android.content.Context;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class WebFontLoader {
    private String TAG ="WebFontLoader";

    //"www/fonts/gamjatxt.txt"
    private String readTxt(Context ctx, String filePath){
        String txt = null;
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(ctx.getAssets().open(filePath)));

            StringBuilder sb = new StringBuilder();
            String line = reader.readLine();
            while(line != null) {
                sb.append(line);
                line = reader.readLine();
            }
            reader.close();
            txt = sb.toString();
            MyLog.i(TAG,filePath+": "+txt);
        } catch (IOException e) {
            MyLog.w(TAG,"IOException: "+e.getMessage());
            return "";
        }
        return txt;
    }


    public String getJsData(Context ctx, String filePath, String FontFamily){
        String js = "var sheet = document.createElement('style');";
        //js += "document.body.style.fontFamily = '"+FontFamily+"'; ";
        js += "document.body.style.fontFamily = \"'Noto Sans KR','Pretendard','AppleGothic','NanumGothic','malgun gothic','dotum','sans-serif'\";";

        js += "sheet.innerHTML = \""+readTxt(ctx,filePath)+"\"; document.head.appendChild(sheet);";
        return "javascript:(function() { " + js + " })()";
    }
}
String font1 = new WebFontLoader().getJsData(context,"www/fonts/notokr-light.txt","Noto Sans KR");
binding.rootWebView.loadUrl("javascript:(function() { " + font1 + " })()");

font 자원을 assets에 넣어서 사용한다.

NotoSansKR-Black.txt
1.73MB

https://hellogreg.github.io/woff2base/   <-- 폰트를 base64로 변환하여 사용한다.

반응형