繪制


圖形繪制方面我覺(jué)得HenCoder系列是比較透徹易懂的,非常推薦,所以正在學(xué)習(xí)他的一系列文章

以下是我的筆記

原文鏈接:

HenCoder Android 開(kāi)發(fā)進(jìn)階:自定義 View 1-3 文字的繪制

Android 開(kāi)發(fā)進(jìn)階:自定義 View 1-4 Canvas 對(duì)繪制的輔助

Android 開(kāi)發(fā)進(jìn)階:自定義 View 1-5 繪制順序

1.文字繪制

1.Canvas 的文字繪制方法有三個(gè):

drawText() 常用方法

drawTextRun() 不常用,對(duì)于一些特殊國(guó)家文字管用

drawTextOnPath()按照一定的路徑繪制文字

2.StaticLayout

drawText不能自動(dòng)換行也不會(huì)對(duì)換行符起作用,StaticLayout 支持換行,它既可以為文字設(shè)置寬度上限來(lái)讓文字自動(dòng)換行,也會(huì)在 \n 處主動(dòng)換行。

并不是一個(gè) View 或者 ViewGroup ,而是 android.text.Layout 的子類,它是純粹用來(lái)繪制文字的

3.測(cè)量文字的方法

1.getTextBounds(String text, int start, int end, Rect bounds)

text 是要測(cè)量的文字,start 和 end 分別是文字的起始和結(jié)束位置,bounds 是存儲(chǔ)文字顯示范圍的對(duì)象,方法在測(cè)算完成之后會(huì)把結(jié)果寫(xiě)進(jìn) bounds

它測(cè)量的是文字的顯示范圍(關(guān)鍵詞:顯示)。形象點(diǎn)來(lái)說(shuō),你這段文字外放置一個(gè)可變的矩形,然后把矩形盡可能地縮小,一直小到這個(gè)矩形恰好緊緊包裹住文字,那么這個(gè)矩形的范圍,就是這段文字的 bounds

2.float measureText(String text)

測(cè)量文字的寬度并返回,它測(cè)量的是文字繪制時(shí)所占用的寬度(關(guān)鍵詞:占用)

由于左右要加上一些字間距,所以用這個(gè)方法測(cè)量出來(lái)的比用getTextBounds要大

3.getTextWidths(String text, float[] widths)

獲取字符串中每個(gè)字符的寬度,并把結(jié)果填入?yún)?shù) widths。

4.int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)

在給出寬度上限的前提下測(cè)量文字的寬度。如果文字的寬度超出了上限,那么在臨近超限的位置截?cái)辔淖?/p>

返回值是截取的文字個(gè)數(shù)(如果寬度沒(méi)有超限,則是文字的總個(gè)數(shù))

這個(gè)方法可以用于多行文字的折行計(jì)算


2.Canvas

1.范圍裁切

clipRect()

clipPath()

裁切方法之后的繪制代碼,都會(huì)被限制在裁切范圍內(nèi)。要加上 Canvas.save() 和 Canvas.restore() 來(lái)及時(shí)恢復(fù)繪制范圍

2.幾何變換

2.1使用 Canvas 來(lái)做常見(jiàn)的二維變換;

Canvas.translate(float dx, float dy) 平移

Canvas.rotate(float degrees, float px, float py) 旋轉(zhuǎn)

Canvas.scale(float sx, float sy, float px, float py) 放縮

skew(float sx, float sy) 錯(cuò)切

需要注意的是這幾個(gè)方法都是preconcat,所以需要把變換順序反著寫(xiě),比如:先平移在旋轉(zhuǎn),那代碼就要先寫(xiě)旋轉(zhuǎn)再寫(xiě)平移。

2.2使用 Matrix 來(lái)做常見(jiàn)和不常見(jiàn)的二維變換;

創(chuàng)建 Matrix 對(duì)象;

調(diào)用 Matrix 的 pre/postTranslate/Rotate/Scale/Skew() 方法來(lái)設(shè)置幾何變換;

使用 Canvas.setMatrix(matrix) 或 Canvas.concat(matrix) 來(lái)把幾何變換應(yīng)用到 Canvas。這兩者區(qū)別是前者用 Matrix 直接替換 Canvas 當(dāng)前的變換矩陣,即拋棄 Canvas 當(dāng)前的變換,不同的手機(jī)系統(tǒng)中 setMatrix(matrix) 的行為可能不一致,后者用 Canvas 當(dāng)前的變換矩陣和 Matrix 相乘,即基于 Canvas 當(dāng)前的變換,疊加上 Matrix 中的變換,盡量用后者

2.3使用 Camera 來(lái)做三維變換。

Camera 的三維變換有三類:旋轉(zhuǎn)、平移、移動(dòng)相機(jī)。

Camera 和 Canvas 一樣也需要保存和恢復(fù)狀態(tài)才能正常繪制

3.繪制順序



在 ViewGroup 的子類中重寫(xiě)除 dispatchDraw() 以外的繪制方法時(shí),可能需要調(diào)用 setWillNotDraw(false);

在重寫(xiě)的方法有多個(gè)選擇時(shí),優(yōu)先選擇 onDraw()。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容