Android中關於字型寬高的獲取

2021-07-23 16:21:00 字數 3301 閱讀 4458

在自定義控制項中,有時我們也需要在其中加入一些文字進行繪製時,那麼,此時,對於文字繪製的位置,

width = paint.measuretext(text,

0,text.length());

rect rect = new rect();

paint.gettextbounds(text,

0,text.length(), rect);

width = rect.width();

那麼,android系統給我們提供這兩種方式去獲取幹嘛呢?用一種不就好了,

能這麼想,很有計算機的天賦,我當時也是這麼想的,後來實驗了一把,

第一種方式,得到的width獲取第二種方式得到的width的值會大一點,

這又是為什麼呢?第一種方式得到的width會在左右文字留有一絲間距,

這樣在與其它控制項併排繪製時,會有一種美感,第二種方式得到的就是

文字的真正寬度,兩邊剛好緊密包裹著文字,兩種寬度,具體使用哪一種,

看使用者自己的乙個需求,如果想繪製的控制項和文字併排時留有一點空隙,

就推薦使用第一種,想繪製的控制項和文字之間不留任何空隙,那就使用

第二種方式

在得出文字高度獲取之前(賣下關子 ^_^),我們先來熟悉一下fontmetricsint這個類的幾個屬性:

在谷歌文件中,關於這幾個屬性的解釋具體如下:

通過上述解釋,我們可以大概知道一些資訊:

ascent和top是位於位於baseline之上的,descent和bottom是位於baseline之下的。

那麼,問題來了,baseline是個什麼鬼?baseline就是我們在繪製文字去呼叫

canvas.drawtext()時,其引數中所指定的座標就是baseline這條線的乙個起始座標。

然後,還可以得到一點資訊就是:

ascent是基於baseline之上,乙個推薦的間距值

bottom是基於baseline之下,乙個最大的間距值

descent是基於baseline之下,乙個推薦的間距值

leading就是文字的行與行之間的乙個間距值

top是基於baseline之上,最大的乙個間距值

這幾個屬性都可通過如下式子得到其值:

leading = paint.getfontmetrics().leading

;top = paint.getfontmetrics().top

;ascent = paint.getfontmetrics().ascent

;descent = paint.getfontmetrics().descent

;bottom = paint.getfontmetrics().bottom

;

從上述示意圖中,我們看到:

還是沒法確切得到文字的高度,因為其與文字之間還是留有一些空隙,

並不能確切知道文字具體的乙個高度值,你能看到這一點,就說明很

有前途,至少在計算機這條路上我沒有看錯你。那麼,既然這幾個屬性

沒法解決我們的問題,那麼

android小弟必須給我們提供其它的

api,是不?

那就是通過

paint.gettextbounds(....)這個方法會返回rect,然後呼叫rect.height()

得到乙個高度值,那麼此時這個高度值就是緊緊包裹文字的高度值,其與文字是

緊緊貼在一起的。也就是說,我們通過rect.height()就可以得到文字的乙個具體

的高度值。

那麼,問題又來了,說了這麼多,直接告訴我們rect.height()得到其高度值不就

可以了麼?還介紹啥fontmetricsint

類的屬性,主要是因為,在文字繪製的過程中,

文字是基於一條baseline來進行繪製的,而baseline一般不是完全處於文字的下方

的,而是處在文字中間偏下的乙個位置,這樣,就算給出了文字的高度,也知道

baseline

的具體位置,還是不方便直接得出文字距離baseline上邊有多少間距, 距離

baseline下邊

有多少間距,所以,我想這大概就是android給我們引出

fontmetricsint

類的幾個屬性的原因,有了fontmetricsint這個類的幾個屬性之後,

我們在文字的

上下方去繪製其它控制項時,就可以很清晰地知道在距離baseline的

下方多少距離時去繪製

就可以剛好不用覆蓋文字了

1>

文字的真實寬度,可通過如下方式來獲取:

rect rect = new rect();

paint.gettextbounds(text,

0,text.length(), rect);

width = rect.width()

2>文字的真實高度,可通過如下方式來獲取:

rect rect = new rect();

paint.gettextbounds(text,

0,text.length(), rect);

height = rect.height()

3>若通過如下方式獲取寬度:

width = paint.measuretext(text,

0,text.length());

則用這個寬度當做文字繪製的寬度,則可以使繪製的控制項和文字之間留有一絲間隙,

看起來更具美感

4>

fontmetricsint

類的幾個屬性提供給我們,主要是方便我們在繪製期間更好地計算文字和控制項之間的距離,

同時也讓文字和繪製的控制項更具美感(因為有一定間隙)。至於說,top和ascent之間如何選擇,主要是看

個人需求,如果覺得用ascent有些緊湊,那你可以選擇更大一點空間的top值,bottom和descent之間的

選擇也是如此

字型寬高獲取的示例原始碼

取到canvas中字型寬與高的值

context.measuretext 顯示的文字資訊 width第二種方法 我們是可以設定字型的,想一想是不是,顯示的文字的個數 字型尺寸 字型的寬度 缺點是如果你使用下面的這個放大縮小的方法 上面的公式就不管用了 應該是文字的個數 字型尺寸 放大縮小值 字型的寬度 context.scale s...

關於js計算非等寬字型寬度的方法

首先在body外插入乙個absolute的容器避免重繪 const svgwidthtestcontainer document.createelement svg svgwidthtestcontainer.setattribute id svgwidthtest svgwidthtestcont...

關於js計算非等寬字型寬度的方法

首先在body外插入乙個absolute的容器避免重繪 const svgwidthtestcontainer document.createelement svg svgwidthtestcontainer.setattribute id svgwidthtest svgwidthtestcont...