我正在使用Android的WebView类构建一个webapp。目前,当我将它指向我的页面时,任何日文字符都使用DroidSansFallback字体呈现,这就是我想要的。但是,当设备的语言更改为日语时,它会开始在MTLmr3m.ttf字体中呈现日语字符,这有时会影响正在加载的网页的布局。在做了一些研究之后,我发现这是由于fallback_fonts.xml系统文件中的这段代码所致
<family>
<fileset>
<file lang="ja">MTLmr3m.ttf</file>
</fileset>
</family>
据推测我无法更改此系统文件,但有一种方法可以直接引用DroidSansFallback.ttf文件并将字体设置为当字符串具有日语字符时的字体,以便使用此字体而不管语言是什么设备设置为?
我尝试使用WebViewClient类中的shouldInterceptRequest()
来捕获css @ font-face delcaration中的伪协议,如下所示:src: url("font:Droid") format("truetype");
并通过此代码发送字体:
...
if (url.equals("font:Droid")){
File font = new File(Environment.getRootDirectory(),"/fonts/DroidSansFallback.ttf");
InputStream is = new FileInputStream(font);
String encoding="UTF-8";
WebResourceResponse font = new WebResourceResponse("font/ttf",encoding,is);
return font;
}
...
该方法捕获请求,但不按预期返回WebResourceResponse。
我希望可能有一个解决方案,我可以在某种程度上引用CSS中我想要的字体。有什么建议吗?
答案 0 :(得分:0)
我知道这一定要迟到才能回答,但可能对某人有用。
1)除非您拥有Root权限,否则无法访问Android根目录“ / ”。
2)我相信您使用了错误的mimetype字体,请使用“ application / x-font-ttf ”
所以你有2个选项,把你想要的字体放在资产中,或者将你的字体复制到外部存储器 我将展示第一种方式并将另一种方式留给您。
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{
if(url.contains("font/droid.ttf"))
{
return getFontFromAsset();
}
}
private WebResourceResponse getFontFromAsset()
{
InputStream fontIn = null;
try
{
fontIn = yourContext.getAssets().open("DroidSansFallback.ttf");
}
catch (IOException e)
{
e.printStackTrace();
}
if(fontIn == null)
return null;
else
{
WebResourceResponse response = new WebResourceResponse("application/x-font-ttf", "UTF-8", fontIn);
return response;
}
}
你也可以为你的css使用这样的东西:
@font-face { font-family: 'droid'; src: url('font/droid.ttf');} body { font-family: 'droid';}
这是我的工作方法。