Android開發 為應用設定自定義字型

2021-07-02 22:17:24 字數 3934 閱讀 9846

在應用開發中,或許你會聽到設計獅和產品錦鯉這樣抱怨,安卓原生的字型太醜啦,傻大笨粗啊,有沒有辦法換成細體啊…?不幸的是,安卓字型確實傻大笨粗,其次,只有normal和bold,沒有light啊.如果更不幸的是,你看不上安卓可以切換的幾種字型,一定要使用自己的字型檔案時,該怎麼辦呢?下面介紹三種方法,讓應用換上新的字型.

(注: 前兩種方法都有侷限性,想要替換整個應用字型的,直接看第三種方法, 對android lollipop同樣支援)

public

class

customfonttextview

extends

textview

public

customfonttextview(context context, attributeset attrs)

public

customfonttextview(context context, attributeset attrs, int defstyleattr)

public

void

init(context context)

}

public

class

fonthelper else

if (mchild instanceof edittext) else

if (mchild instanceof viewgroup) else

if (reflect) catch (exception e) }}

}}

例如我們的布局檔案是這樣的:

xmlns:android=""

xmlns:tools=""

android:id="@+id/content"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".mainactivity">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="字型 123 abc"

android:textcolor="@android:color/black"

android:textsize="40dp"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="字型 123 abc"

android:textcolor="@android:color/black"

android:textsize="40dp"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="字型 123 abc"

android:textcolor="@android:color/black"

android:textsize="40dp"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="字型 123 abc"

android:textcolor="@android:color/black"

android:textsize="40dp"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="字型 123 abc"

android:textcolor="@android:color/black"

android:textsize="40dp"

android:typeface="sans"/>

linearlayout>

linearlayout>

我們可以這樣修改字型:

final typeface mfont = typeface.createfromasset(getassets(),

"fonts/roboto-light.ttf");

final viewgroup mcontainer = (viewgroup) findviewbyid(

android.r

.id.content).getrootview();

其實這個方法才是我們絕大多數數時候想要用的, 一次性替換應用全部字型.

由於官方並沒有提供相應的介面,所以這裡我們採用的方式時通過反射,獲取typeface類的靜態成員變數,並修改對應的字型檔案.

這裡根據你使用的主題和api的不同,處理方式也有所區別:

public

final

class

fontsoverride

protected

static

void

replacefont(string statictypefacefieldname,

final typeface newtypeface) catch (nosuchfieldexception | illegalacces***ception e)

}}

然後在主題裡指定使用某種字型(android lollipop設定有區別):

values

style>

name="android

:typeface">monospace

item>

style>

resources>

values-v21

name="android

style>

name="android

:typeface">monospace

item>

style>

resources>

fontsoverride.setdefaultfont(this, "monospace", "fonts/myfont.ttf");
public

final

class

fontsoverride

protected

static

void

replacefont(string statictypefacefieldname,

final typeface newtypeface) catch (nosuchfieldexception | illegalacces***ception e)

} else catch (nosuchfieldexception | illegalacces***ception e) }}

}

//material主題預設字型為sans-serif,暫時未找到自定義修改字型的方法

fontsoverride.setdefaultfont(this, "sans-serif", "fonts/roboto-light.ttf");

有需要的可以參考原始碼

Android應用開發優化

最近總結了一些,android應用開發中,需要注意的一些事項,與大家分享 1.盡量少的宣告全域性變數 2.宣告全域性靜態變數,一定要加final宣告 3.宣告非靜態的全域性變數,最好不要初始化任何值,在使用到的地方,在進行初始化 4.函式中若干次使用全域性變數,應該將全域性變數賦值給本地變數,然後直...

Android應用開發 AsyncTask

摘錄自 android 多執行緒 asynctask詳解 asynctaskasynctask params,progress,result params 這個泛型指定的是我們傳遞給非同步任務執行時的引數的型別 progress 這個泛型指定的是我們的非同步任務在執行的時候將執行的進度返回給ui執行...

Android 應用開發環境搭建

想起以前上學時候,mfc開發可謂紅極一時。尤其是vc6.0這個工具,安裝完畢之後,不但可以進行常用的console開發,也可以進行帶介面的mfc開發,簡單好用。而今對於android應用,開發環境需要小心配置,弄大半天可能連乙個helloworld的介面程式的寫不出來。今晚在ubuntu12上搭建了...