AndroidDrawText詳解

      網友投稿 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),但是當你通過:

      Android之DrawText詳解

      來畫文字的時候,發現只有文字的下半部分畫出來了,因為你傳遞進去的參數應該是以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小時內刪除侵權內容。

      上一篇:榜單揭曉!華為云社區2020年度十佳博主出爐啦!
      下一篇:Netconf協議學習第二期
      相關文章
      亚洲国产婷婷六月丁香| 亚洲Av无码专区国产乱码DVD | 亚洲成AV人片在线观看ww| 亚洲av无码国产精品色在线看不卡 | 亚洲国产成人精品女人久久久 | 亚洲国产综合人成综合网站00| 亚洲伊人久久大香线蕉苏妲己| 亚洲精品一品区二品区三品区| 亚洲偷自拍拍综合网| 亚洲精品第一国产综合境外资源 | 国产亚洲精品免费| 在线亚洲v日韩v| 人人狠狠综合久久亚洲高清 | 99亚洲精品高清一二区| 亚洲专区在线视频| 亚洲综合久久综合激情久久| 久久久亚洲欧洲日产国码aⅴ| 亚洲天天在线日亚洲洲精| 亚洲国产精品lv| 亚洲精品一卡2卡3卡三卡四卡| 亚洲日韩中文字幕| 亚洲xxxxxx| 国产亚洲中文日本不卡二区| 亚洲中文字幕无码中文| 亚洲第一综合天堂另类专 | 亚洲av午夜成人片精品网站| 久久久亚洲欧洲日产国码农村| 久久精品国产精品亚洲艾| 亚洲最大的成网4438| 亚洲成a人片在线观| 亚洲一区二区三区91| 亚洲中文无码mv| 亚洲AV一区二区三区四区| 亚洲高清偷拍一区二区三区| 久久亚洲AV永久无码精品| 亚洲成色www久久网站夜月| 2022年亚洲午夜一区二区福利| 亚洲成人免费网址| 亚洲五月丁香综合视频| 亚洲成a人无码亚洲成av无码| 国产亚洲视频在线观看|