繪制


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市能庆,隨后出現(xiàn)的幾起案子施禾,更是在濱河造成了極大的恐慌,老刑警劉巖搁胆,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弥搞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡渠旁,警方通過查閱死者的電腦和手機(jī)攀例,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顾腊,“玉大人粤铭,你說我怎么就攤上這事≡影校” “怎么了梆惯?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵酱鸭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我垛吗,道長(zhǎng)凹髓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任怯屉,我火速辦了婚禮蔚舀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚀之。我一直安慰自己蝗敢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布足删。 她就那樣靜靜地躺著寿谴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪失受。 梳的紋絲不亂的頭發(fā)上讶泰,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音拂到,去河邊找鬼痪署。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兄旬,可吹牛的內(nèi)容都是我干的狼犯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼领铐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悯森!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绪撵,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤瓢姻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后音诈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幻碱,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年细溅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褥傍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谒兄,死狀恐怖摔桦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤邻耕,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布鸥咖,位于F島的核電站,受9級(jí)特大地震影響兄世,放射性物質(zhì)發(fā)生泄漏啼辣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一御滩、第九天 我趴在偏房一處隱蔽的房頂上張望鸥拧。 院中可真熱鬧,春花似錦削解、人聲如沸富弦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腕柜。三九已至,卻和暖如春矫废,著一層夾襖步出監(jiān)牢的瞬間盏缤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工蓖扑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唉铜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓律杠,卻偏偏與公主長(zhǎng)得像潭流,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柜去,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容