圖形繪制方面我覺(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()。