Canvas drawText and FontMetrics

問題引入

在自定View執(zhí)行onDraw時,需要調(diào)用Canvas的drawText方法 (Canvas類說明

drawText?(Stringtext, float x, float y,Paint?paint) 使用基本的drawText方法時,不明確文字繪制位置是如何受到origin坐標影響的

1.Canvas.drawText中x、y位置的說明

2.使用TextPaint來繪制文字?(以下摘自鏈接2)

FontMerics理論知識

Baseline是基線,在Android中,文字的繪制都是從Baseline處開始的,Baseline往上至字符“最高處”的距離我們稱之為ascent(上坡度),Baseline往下至字符“最低處”的距離我們稱之為descent(下坡度);Baseline上方的值為負,下方的值為正

leading(行間距)則表示上一行字符的descent到該行字符的ascent之間的距離;

top的意思其實就是除了Baseline到字符頂端的距離外還應該包含這些符號的高度,bottom的意思也是一樣。一般情況下我們極少使用到類似的符號所以往往會忽略掉這些符號的存在,但是Android依然會在繪制文本的時候在文本外層留出一定的邊距,這就是為什么top和bottom總會比ascent和descent大一點的原因。而在TextView中我們可以通過xml設置其屬性android:includeFontPadding="false"去掉一定的邊距值但是不能完全去掉。

fontMetrics中的變量和文字的size、typeface有關

TypePaint中各個方法的使用說明

setTextAlign各種對齊方式帶來的影響示例

3.FontMetrics的各種文字示意圖輔助說明

4.一種繪制文字水平及垂直居中的方法?

targetRect.centerY() - (FontMetrics.bottom - FontMetrics.top) / 2 - FontMetrics.top

(FontMetrics.bottom - FontMetrics.top) / 2?

—— 文字的top與bottom間的距離,十分接近純文字的高度,因為top是負值,所以用bottom-top

文字一行顯示不全需要換行怎么處理

StaticLayout基本使用示例

使用Canvas的drawText繪制文本是不會自動換行的,即使一個很長很長的字符串,drawText也只顯示一行,超出部分被隱藏在屏幕之外??梢灾饌€計算每個字符的寬度,通過一定的算法將字符串分割成多個部分,然后分別調(diào)用drawText一部分一部分的顯示, 但是這種顯示效率會很低。

StaticLayout是android中處理文字換行的一個工具類,StaticLayout已經(jīng)實現(xiàn)了文本繪制換行處理

StaticLayout在繪制的時候,默認從Canvas的(0,0)位置開始,且無法定位,所以要對canvas做translate處理

···java

canvas.save();

canvas.translate(textX,textY);

mTextLayout.draw(canvas);

canvas.restore();

···

String 和 Charsequence 有什么區(qū)別

String Charsequence StringBuilder StringBuffer的區(qū)別

String is Charsequence

String 和 CharSequence 關系

String 繼承于CharSequence,也就是說String也是CharSequence類型。

CharSequence是一個接口,它只包括length(), charAt(int index), subSequence(int start, int end)這幾個API接口。除了String實現(xiàn)了CharSequence之外,StringBuffer和StringBuilder也實現(xiàn)了CharSequence接口。

需要說明的是,CharSequence就是字符序列,String, StringBuilder和StringBuffer本質(zhì)上都是通過字符數(shù)組實現(xiàn)的!

StringBuilderStringBuffer的區(qū)別

StringBuilderStringBuffer都是可變的字符序列。它們都繼承于AbstractStringBuilder,實現(xiàn)了CharSequence接口。

但是,StringBuilder是非線程安全的,而StringBuffer是線程安全的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容