圖形繪制方面我覺得HenCoder系列是比較透徹易懂的,非常推薦哥谷,所以正在學(xué)習(xí)他的一系列文章
以下是我的筆記
原文鏈接:
HenCoder Android 開發(fā)進(jìn)階:自定義 View 1-3 文字的繪制
Android 開發(fā)進(jìn)階:自定義 View 1-4 Canvas 對(duì)繪制的輔助
Android 開發(fā)進(jìn)階:自定義 View 1-5 繪制順序
1.文字繪制
1.Canvas 的文字繪制方法有三個(gè):
drawText() 常用方法
drawTextRun() 不常用芯杀,對(duì)于一些特殊國(guó)家文字管用
drawTextOnPath()按照一定的路徑繪制文字
2.StaticLayout
drawText不能自動(dòng)換行也不會(huì)對(duì)換行符起作用齿尽,StaticLayout 支持換行锌介,它既可以為文字設(shè)置寬度上限來讓文字自動(dòng)換行令哟,也會(huì)在 \n 處主動(dòng)換行心傀。
并不是一個(gè) View 或者 ViewGroup 屈暗,而是 android.text.Layout 的子類,它是純粹用來繪制文字的
3.測(cè)量文字的方法
1.getTextBounds(String text, int start, int end, Rect bounds)
text 是要測(cè)量的文字脂男,start 和 end 分別是文字的起始和結(jié)束位置养叛,bounds 是存儲(chǔ)文字顯示范圍的對(duì)象,方法在測(cè)算完成之后會(huì)把結(jié)果寫進(jìn) bounds
它測(cè)量的是文字的顯示范圍(關(guān)鍵詞:顯示)宰翅。形象點(diǎn)來說弃甥,你這段文字外放置一個(gè)可變的矩形,然后把矩形盡可能地縮小堕油,一直小到這個(gè)矩形恰好緊緊包裹住文字潘飘,那么這個(gè)矩形的范圍,就是這段文字的 bounds
2.float measureText(String text)
測(cè)量文字的寬度并返回掉缺,它測(cè)量的是文字繪制時(shí)所占用的寬度(關(guān)鍵詞:占用)
由于左右要加上一些字間距卜录,所以用這個(gè)方法測(cè)量出來的比用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ù)(如果寬度沒有超限搜囱,則是文字的總個(gè)數(shù))
這個(gè)方法可以用于多行文字的折行計(jì)算
2.Canvas
1.范圍裁切
clipRect()
clipPath()
裁切方法之后的繪制代碼丑瞧,都會(huì)被限制在裁切范圍內(nèi)柑土。要加上 Canvas.save() 和 Canvas.restore() 來及時(shí)恢復(fù)繪制范圍
2.幾何變換
2.1使用 Canvas 來做常見的二維變換;
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绊汹,所以需要把變換順序反著寫稽屏,比如:先平移在旋轉(zhuǎn),那代碼就要先寫旋轉(zhuǎn)再寫平移西乖。
2.2使用 Matrix 來做常見和不常見的二維變換狐榔;
創(chuàng)建 Matrix 對(duì)象;
調(diào)用 Matrix 的 pre/postTranslate/Rotate/Scale/Skew() 方法來設(shè)置幾何變換获雕;
使用 Canvas.setMatrix(matrix) 或 Canvas.concat(matrix) 來把幾何變換應(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 來做三維變換。
Camera 的三維變換有三類:旋轉(zhuǎn)球碉、平移蜓斧、移動(dòng)相機(jī)。
Camera 和 Canvas 一樣也需要保存和恢復(fù)狀態(tài)才能正常繪制
3.繪制順序
在 ViewGroup 的子類中重寫除 dispatchDraw() 以外的繪制方法時(shí)睁冬,可能需要調(diào)用 setWillNotDraw(false);
在重寫的方法有多個(gè)選擇時(shí)看疙,優(yōu)先選擇 onDraw()豆拨。