Android中的Serializable、Parcelable">Android中的Serializable、Parcelable
926
2022-05-30
如果你經常使用Canvas的draw***方法去繪制一些圖像圖形,繪制的坐標是從Canvas左上角開始計算的,如果想要把一個圖像放到某個位置,直接drawBitmap傳遞圖片左上角的坐標就行了。那drawText就不一樣,如果你傳遞進去字符串,會發現文字的位置和你指定的不一樣。
Android的文檔也沒有仔細說,打開源碼一看,又跑到native代碼里去執行了。
對于一段文字來說,如果你想把他畫到Canvas上,首先你要確定這段文字的范圍,即寬度和高度,那么怎么去取這一段的高度呢,如果你在網上搜,會有很多種答案,具體應該用哪一種呢?這要看你到底需要什么樣的尺寸了。
Paint.getTextBounds: 當你通過這個方法來獲取尺寸的時候,你可以得到能夠包裹文字的最小矩形,就是圖中紅色邊框的那部分,你可以得到一個Rect對象,包含這個最小尺寸的幾個值。坑其實就在這里:這里的Rect對象坐標并不是以左上角為準的,而是相對于左邊中間靠下位置的一個點,就是圖中的黃色五角星。而這里水平的Baseline指的是字符串對齊的一條線。既然這樣,r.top就是一個負值了,r.bottom會是一個小一點的正值,r.left和r.right在圖中畫的都很清楚。通過r.width()和r.height()來獲取尺寸。
那么文字的偏移就好說了,比如說你要把文字畫在Canvas的左上角,坐標是(0,0),但是當你通過:
來畫文字的時候,發現只有文字的下半部分畫出來了,因為你傳遞進去的參數應該是以Baseline為標準的,正確的方法是:
Paint.getFontMetricsInt(): 當你通過這里方法來獲取尺寸的時候,你獲取的只是一個垂直方向上的尺寸,這里的ascent代表的是字體的上部,descent代表的是字體的下部,這里需要注意的是這和上面獲得的Rect的top和bottom不太一樣,他們比比ascent和descent距離稍微小一些,這些具體的高度可能和不同的字體和渲染方式有關系,這里就不深入了 #我是不懂#。
然后如果把文字寫入TextView(圖中藍色部分)并且設置TextView的高度和寬度設為wrap_content,那么TextView的高度就正好是FontMetricsInt.top – FontMetricsInt.bottom, 那寬度呢? Paint.measureText()。
Android Canvas
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。