Android之玩轉(zhuǎn)View(六):Canvas基礎使用和Region模式

請尊重原創(chuàng)炮温,轉(zhuǎn)載請注明出處【tianyl】的博客

關于的Android之玩轉(zhuǎn)View目錄

前言

之前說了Android中的Paint火脉,當然,在Android的圖像繪制中柒啤,除了Paint這個重要的工具類之后,還有一個同樣重要的工具類Canvas

從字面意思上理解畸颅,Paint是畫筆担巩,而Canvas則是畫布,一般來講没炒,我們使用Canvas都是通過onDraw方法里的參數(shù)傳入的涛癌,當然我們也可以自己new一個這樣的對象

1 Canvas的基礎使用

一般Canvas的使用,需要我們準備Paint對象和Canvas對象

  • Paint對象處理顏色送火,粗細拳话,效果等
  • Canvas對象處理具體繪制的形狀(根據(jù)面向?qū)ο蟮乃枷耄瑢⒗L制方式封裝到了Canvas中)

Canvas可以繪制的形狀非常多种吸,包含點弃衍、線、面(圖片坚俗,矩形等)

1.1

如下镜盯,就是一個畫出一條直線的例子

Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10);
canvas.drawLine(100, 100, 400, 400, paint);

1.2

畫圓角矩形

Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10);
RectF r = new RectF(100, 100, 400, 500);
canvas.drawRoundRect(r, 30, 30, paint);

canvas可繪制的形狀還有很多岸裙,這里就不一一演示了

2 Region

上面介紹了Canvas中比較基礎用法,接著再說說Canvas中一個比較有意思的用法——Region

2.1 Region的基本用法

Region的字面意思是區(qū)域的意思速缆,要字面解釋這個類的效果比較難降允,下面通過一個例子說明

//初始化畫筆
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
//初始化圓角矩形路徑
RectF r = new RectF(100, 100, 600, 800);
Path path = new Path();
float radii[] = {10,10,10,10,10,10,50,60};
path.addRoundRect(r, radii, Path.Direction.CCW);

//創(chuàng)建一塊矩形的區(qū)域
Region region = new Region(100, 100, 600, 800);
//創(chuàng)建一個新的區(qū)域,它是上述區(qū)域和矩形的交集
Region region1 = new Region();
region1.setPath(path, region);

//區(qū)域不能直接繪制艺糜,需要使用迭代器
RegionIterator iterator = new RegionIterator(region1);

Rect rect = new Rect();
while (iterator.next(rect)) {
    canvas.drawRect(rect, paint);
}

效果如下


下面來對這段代碼進行解釋

  1. 首先初始化畫筆和圓角矩形
  2. 創(chuàng)建一個矩形區(qū)域
  3. 獲取矩形區(qū)域和圓角矩形區(qū)域的交集
  4. 繪制這個新獲得的區(qū)域

關于區(qū)域的繪制剧董,有點微積分的思想破停,它是首先將這個區(qū)域分割出一個足夠大的矩形,然后不斷的分割出相對較小的矩形進行繪制

所以我們看到的就是最中間的矩形最大犁嗅,邊緣因為有圓角晤碘,所以矩形相對較小园爷,最終達到圖中的效果,這就可以實現(xiàn)多張圖片疊加的效果

2.2 Region的模式

說到模式求厕,是不是就想到了Xfermode的18種模式扰楼?其實Region也有類似的模式弦赖,只不過這里沒有18種,只有6種

下面就通過一組圖片說明這些模式的含義

首先沼沈,我們準備兩張圖片列另,左邊是src旦装,右邊是dst

然后我們將這兩張圖片進行重疊,原圖如下


然后使用Op中的6種模式繪制出來拷姿,效果如下(顏色統(tǒng)一用綠色,線是額外畫出來的响巢,真實效果不存在此線)

代碼如下

//初始化2個矩形
Rect rect1 = new Rect(200,200,500,500);
Rect rect2 = new Rect(300,300,600,600);
//設置畫筆畫出提示用的邊框線
paint.setColor(Color.GREEN);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
//繪制二個邊框
canvas.drawRect(rect1, paint);
paint.setColor(Color.BLUE);
canvas.drawRect(rect2, paint);
//構(gòu)造兩個Region
Region region1 = new Region(rect1);
Region region2= new Region(rect2);
region1.op(region2, Region.Op.REPLACE);
//修改畫筆屬性,填充內(nèi)部
paint.setStyle(Paint.Style.FILL);
//繪制出對應的效果
 RegionIterator it = new RegionIterator(region1);
Rect rect = new Rect();
while (it.next(rect)) {
    canvas.drawRect(rect, paint);
}
  • 補集(DIFFERENCE)


  • 交集(INTERSECT)


  • 并集(UNION)


  • 異或集(XOR)


  • 反轉(zhuǎn)補集(REVERSE_DIFFERENCE)


  • 替換(REPLACE)


3 結(jié)尾

關于Canvas的內(nèi)容還有很多伏穆,因為篇幅原因只能放后面補充了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枕扫,一起剝皮案震驚了整個濱河市烟瞧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌强岸,老刑警劉巖砾赔,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暴心,死亡現(xiàn)場離奇詭異酷勺,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門击胜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來役纹,“玉大人偶摔,你說我怎么就攤上這事〈俾觯” “怎么了辰斋?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宫仗。 經(jīng)常有香客問我够挂,道長藕夫,這世上最難降的妖魔是什么孽糖? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮毅贮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滩褥。我一直安慰自己病蛉,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布瑰煎。 她就那樣靜靜地躺著铺然,像睡著了一般丢间。 火紅的嫁衣襯著肌膚如雪探熔。 梳的紋絲不亂的頭發(fā)上烘挫,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天饮六,我揣著相機與錄音寝受,去河邊找鬼侦副。 笑死,一個胖子當著我的面吹牛痊土,可吹牛的內(nèi)容都是我干的虑凛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼殖属,長吁一口氣:“原來是場噩夢啊……” “哼姐叁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤外潜,失蹤者是張志新(化名)和其女友劉穎原环,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體处窥,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡嘱吗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碧库。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柜与。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嵌灰,靈堂內(nèi)的尸體忽然破棺而出弄匕,到底是詐尸還是另有隱情,我是刑警寧澤沽瞭,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布迁匠,位于F島的核電站,受9級特大地震影響驹溃,放射性物質(zhì)發(fā)生泄漏城丧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一豌鹤、第九天 我趴在偏房一處隱蔽的房頂上張望亡哄。 院中可真熱鬧,春花似錦布疙、人聲如沸蚊惯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽截型。三九已至,卻和暖如春儒溉,著一層夾襖步出監(jiān)牢的瞬間宦焦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工顿涣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留波闹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓涛碑,卻偏偏與公主長得像舔痪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锌唾,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353