問題引入
在自定View執(zhí)行onDraw時,需要調(diào)用Canvas的drawText方法 (Canvas類說明)
drawText?(Stringtext, float x, float y,Paint?paint) 使用基本的drawText方法時,不明確文字繪制位置是如何受到origin坐標影響的
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各種對齊方式帶來的影響示例
targetRect.centerY() - (FontMetrics.bottom - FontMetrics.top) / 2 - FontMetrics.top
(FontMetrics.bottom - FontMetrics.top) / 2?
—— 文字的top與bottom間的距離,十分接近純文字的高度,因為top是負值,所以用bottom-top
文字一行顯示不全需要換行怎么處理
使用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 和 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)的!
StringBuilder和StringBuffer的區(qū)別
StringBuilder和StringBuffer都是可變的字符序列。它們都繼承于AbstractStringBuilder,實現(xiàn)了CharSequence接口。
但是,StringBuilder是非線程安全的,而StringBuffer是線程安全的。