canvas高度问题_Android的drawText的坐标问题
最近做列表優化時, 看到TextView的setText竟然也很耗時, 因為每次都要重新為新的顯示內容計算換行如何換行.
想著把這部分工作放在非UI線程中做, 就像LITHO一樣.
谷歌想什么呢? 非得把meaure, layout這些耗時操作放在UI線程中嗎?
想到對于簡單的文本, 自己實現一個view, 通過drawText畫出來.
但是遇到了drawText的坐標問題:
對于一段文字來說,如果你想把他畫到Canvas上,首先你要確定這段文字的范圍,即寬度和高度,那么怎么去取這一段的高度呢,如果你在網上搜,會有很多種答案,具體應該用哪一種呢?這要看你到底需要什么樣的尺寸了。
Paint.getTextBounds: 當你通過這個方法來獲取尺寸的時候,你可以得到能夠包裹文字的最小矩形,就是圖中紅色邊框的那部分,你可以得到一個Rect對象,包含這個最小尺寸的幾個值。坑其實就在這里:這里的Rect對象坐標并不是以左上角為準的,而是相對于左邊中間靠下位置的一個點,就是圖中的黃色五角星。而這里水平的Baseline指的是字符串對齊的一條線。既然這樣,r.top就是一個負值了,r.bottom會是一個小一點的正值,r.left和r.right在圖中畫的都很清楚。通過r.width()和r.height()來獲取尺寸。
那么文字的偏移就好說了,比如說你要把文字畫在Canvas的左上角,坐標是(0,0),但是當你通過:
canvas.drawText(“dangwen”,0,0,paint);
來畫文字的時候,發現只有文字的下半部分畫出來了,因為你傳遞進去的參數應該是以Baseline為標準的,正確的方法是:
canvas.drawText(“dangwen”,-r.left,-r.top,paint);
Paint.getFontMetricsInt(): 當你通過這里方法來獲取尺寸的時候,你獲取的只是一個垂直方向上的尺寸,這里的ascent代表的是字體的上部,descent代表的是字體的下部,這里需要注意的是這和上面獲得的Rect的top和bottom不太一樣,他們比比ascent和descent距離稍微小一些,這些具體的高度可能和不同的字體和渲染方式有關系,這里就不深入了 #我是不懂#。
然后如果把文字寫入TextView(圖中藍色部分)并且設置TextView的高度和寬度設為wrap_content,那么TextView的高度就正好是FontMetricsInt.top – FontMetricsInt.bottom, 那寬度呢? Paint.measureText()。
總結
以上是生活随笔為你收集整理的canvas高度问题_Android的drawText的坐标问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 训练作用_不同振幅的振动训练对身体的作用
- 下一篇: 凑微分公式_武忠祥真题班归纳(更新至多元