一 原因
后端負責字體...哎,我們公司的前端真的任性啊...
然后,一路踩了jvm關於字體的坑,重點是,java的報錯很隨意,甚至不報錯,建議直接看最后面.
二 代碼
正常要windows裝一次字體,linux裝一次字體,這樣的話系統就能直接拿到了。
但是這樣一點都不兼容,加個字體,還要裝個兩次,反程序員啊。(后面你會發現更加反程序員)
那么,只能把字體放到哦靜態文件里面,然后引用外部字體了。
private static Font definedFont;
private static final String basePath = System.getProperty("user.dir") + File.separator + "web" + File.separator + "src" + File.separator + "main" + File.separator + "resources"
+ File.separator + "static" + File.separator + "backToSchool";
/**
* 引用外部字體
*/
public static void setFont() {
String fontUrl = basePath + File.separator + "fonts" + File.separator + "SourceHanSans-Bold.ttf";
logger.info(".setFont.fontUrl={}", fontUrl);
try {
Font font = Font.createFont(Font.TRUETYPE_FONT, new File(fontUrl));
//設置字體大小,float型
setDefinedFont(font.deriveFont(FONT_SIZE));
} catch (Exception e) {
logger.error(".setFont.e={}", e.getMessage(), e);
throw new ActivityBusinessException(BtsErrorCode.SET_FONT_ERROR);
}
}
public static Font getDefinedFont() {
return definedFont;
}
public static void setDefinedFont(Font font) {
definedFont = font;
}
三 坑
其實代碼很簡單,難點在於字體文件。
坑一
一開始,需求給的otf字體我在開發機和測試機(windows/linux)都安裝了,然后一跑,正常,美滋滋。
但是這樣一點都不程序員,我還要在正式環境裝一次字體,特傻。
於是,只能引用外部字體。
坑二
前頭說了,是otf文件,用正確的代碼跑一下,很好一個報錯都沒有!(此處應有掌聲!)
但是,就是不顯示字體,甚至不用默認字體,什么都沒有輸出,我心想,java竟然沒有報錯????
好吧百度,1個小時之后。
嗯,我只能說這個引用外部的otf在百度上,根本沒有任何解決方法。
甚至問這個問題的人,答案也是叫我們在操作系統安裝,本地引用。
然后,谷歌,stackflow。
大神直接fxxk了一下java的awt,大意就是java說支持引用otf,但是,不支持外部引用otf,最后說了一句awt寫的就是一坨翔。
小數幾個直接爆粗口的答案啊,感覺這哥們也和我那樣浪費一大堆時間,在這傻逼問題上。
於是,只能叫需求給ttf格式的字體。
坑三
很好使用ttf外部引用,謝天謝地,終於報錯了。
FONT NAME ERROR xxxxxx
什么?字體名字不正確的?
大哥,我是根據路徑引用的哦,不是根據字體名字去系統那里取的哦?
是的,這個就是我說的java的報錯很隨意。
那么只能排除了,用個系統的內部字體試一下,正常無報錯。
我那個糾結啊,也就是說外部引用,路徑引用代碼沒錯,而且看了源碼,外部引用也就是路徑引用。
也就是說需求給的ttf有問題,反映一下問題,需求說你想要怎樣的ttf呢?
鬼子知道啊?我也想知道啊!
於是,我只能裝個設計字體的軟件來找一下,兩個ttf文件的不同!
坑四
設計字體的軟件怎么操作,我不想說,太反程序員了,我擔心說出來,會害了你們。
說個大致思路。
用windows打開后,會發現正常的有個數字簽名。
也就是用設計字體的文件加個數字簽名就好了!
其實我是倒因為果,再改之前我都不知道有數字簽名這玩意
直接把一個正常的ttf的非必要屬性,直接覆蓋了不正常的ttf的非必要屬性。然后,改字體名稱什么的,你會發現上圖,基本沒幾個屬性一樣....(夠反程序員了吧?)
至此,功能完全已經實現。
坑五
你們真以為這樣就結束了?
我實現了這個功能之后,還要寫點字進去,然后居中動態靠右。
但是,這個網頁在手機上的,也就是說要搞手機適配!
然后,和前后端的老大說了下,這個需求要實現后端機型適配,獲取長寬來寫字。
最終,兩方大佬逼迫前端學習技術去了,也就是說我搞了這么久,一點用都沒有....
四 結論
字體還是給前端做吧...