반응형
서버에서 폰트를 내려 받으면 자원을 내려 받기 때문에 비용이 많이 발생할수 있다.
따라서 자원을 아끼기 위해서, 네이티브에 자원을 넣고 그 자원을 읽어 들여 자원을 아끼는 방법을 고려해 볼 필요가 있다.
아래의 방법을 통해서 안드로이드의 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에 넣어서 사용한다.
https://hellogreg.github.io/woff2base/ <-- 폰트를 base64로 변환하여 사용한다.
반응형
'안드로이드' 카테고리의 다른 글
[Android] MVVM architecture example (0) | 2023.07.13 |
---|---|
[Android] 딥링크(deeplink)의 정의(URI Scheme, App Link, Deferred Deep Link) (0) | 2023.02.07 |
[android]assets 자원접근를 통해서 웹에서 네이티브 자원 접근 (0) | 2023.02.01 |
[Android] WebView 에서 bridge(@javascriptIngerface)를 구현 (0) | 2023.01.05 |
[안드로이드] WebView uri scheme 마켓 이동 (0) | 2022.12.06 |