關於自定義View的drawText字型測量
當我們在Canvas上drawText的時候會發現和所寫的文字大小和我們給Paint所設定的不一樣,導致我們無法精準的對齊高度,下面我們來
看一下問題出在了哪裡。首先上圖
中文
英文
首先getFontMetrics()我們可以獲得文字的實際佔用位置的各個高度基線(以500xp的文字為例),各個屬性不解釋,直接看圖就能看出來。
Paint.FontMetrics fontMetrics = normalPaint.getFontMetrics();
float top = fontMetrics.top;
float ascent = fontMetrics.ascent;
float leading = fontMetrics.leading;
float descent = fontMetrics.descent;
float bottom = fontMetrics.bottom;
通過列印的結果可以發現各個基線和字元的種類沒有關係,類似小學拼音作業本的四線三格,你的寫中文英文都行反正線就在那,不會動,除非
你要寫大字了,字號變了,當然得換個基線
英文字元
onDraw: ================================TextSize=500.0
onDraw: ==============FontMetrics============top=-528.0762
onDraw: ==============FontMetrics=========ascent=-463.8672
onDraw: ==============FontMetrics========leading=0.0
onDraw: ==============FontMetrics========descent=122.07031
onDraw: ==============FontMetrics=========bottom=135.49805
中文字元
onDraw: ================================TextSize=500.0
onDraw: ==============FontMetrics============top=-528.0762
onDraw: ==============FontMetrics=========ascent=-463.8672
onDraw: ==============FontMetrics========leading=0.0
onDraw: ==============FontMetrics========descent=122.07031
onDraw: ==============FontMetrics=========bottom=135.49805
然後是通過Rect()直接拿文字的高度
Rect txtRec = new Rect();
txtRec.height();
normalPaint.getTextBounds("Hj",0,"Hj".length(),txtRec);
float leftX = x + txtRec.left;
float topY = y +txtRec.bottom-txtRec.height();
float rightX = x+txtRec.right;
float bottomY = y + txtRec.bottom;
通過log可以發現中英文的字元在高度上是有區別,不同的英文字母也是有去別的,因為通過rect拿到的是當前文字實際的高度,中文是方塊字,所以
佔用的寬高基本一致,而英文有的佔用1、2行如R,有的佔用2行如a有的佔用1、2、3行如j,符號就更不用說了。所以drawText的高度對齊都是
通過某條基線對齊的,也就是上面的leading,不是文字top也不是bottom
英文字元
onDraw: ===============TextBounds=======txtRec.bottom=110
onDraw: ===============TextBounds==========txtRec.top=-383
onDraw: ===============TextBounds=========txtRec.left=39
onDraw: ===============TextBounds========txtRec.right=450
中文字元
onDraw: ===============TextBounds=======txtRec.bottom=47
onDraw: ===============TextBounds==========txtRec.top=-391
onDraw: ===============TextBounds=========txtRec.left=39
onDraw: ===============TextBounds========txtRec.right=461
如果上面的這些內容都瞭解了,那麼高度對齊或者通過文字實際頂部/底部對齊就不困難了
相關文章
- 自定義VIEWView
- Android自定義View:View(二)AndroidView
- 有關自定義View的學習知識點View
- 關於自定義 Alert
- Android自定義View整合AndroidView
- 自定義View之SwitchViewView
- Android自定義view-自繪ViewAndroidView
- Flutter自定義View的實現FlutterView
- android自定義view(自定義數字鍵盤)AndroidView
- Vue——關於自定義元件Vue元件
- 關於RecyclerView.ItemDecoration的自定義View
- Flutter中的自定義View的基本流程和相關知識FlutterView
- 【朝花夕拾】Android自定義View篇之(四)自定義View的三種實現方式及自定義屬性詳解AndroidView
- 自定義view————Banner輪播View
- Flutter 自定義繪製 ViewFlutterView
- Flutter自定義View(二)—— MultiChildRenderObejctWidgetFlutterView
- 重拾Android自定義ViewAndroidView
- Android自定義View:ViewGroup(三)AndroidView
- Android 自定義 View 之 LeavesLoadingAndroidView
- Android自定義View之Canvas的使用AndroidViewCanvas
- Flutter自定義字型你想知道的!Flutter自定義字型
- Android 自定義View:深入理解自定義屬性(七)AndroidView
- 關於自定義元件的那些事兒元件
- 【iOS】關於 UICollectionView 的自定義佈局iOSUIView
- 【朝花夕拾】Android自定義View篇之(十一)View的滑動,彈性滑動與自定義PagerViewAndroidView
- 自定義梯形view與XRecyclerView的結合View
- 自定義View的硬體加速問題View
- Android自定義View之分貝儀AndroidView
- 自定義View實用小技巧View
- 自定義View 之 RecyclerView.ItemDecorationView
- Android自定義View之捲尺AndroidView
- 利用Xfermode 自定義形狀ViewView
- 自定義View-波浪動效View
- 自定義View-扭曲動效View
- Android自定義View注意事項AndroidView
- Android自定義View-卷軸AndroidView
- Android自定義View 水波氣泡AndroidView
- Android 自定義View 點贊效果AndroidView