View之Paint讳癌、Canvas廓奕、Path筆記

Paint

屬性配置

  • setAntiAlias:抗鋸齒
  • setDither:抗抖動(dòng)
  • setColor,setARGB,setAlpha:顏色和顯示
  • setShadowLayer(10f, 11f,5f, Color.YELLOW); 第一個(gè)參數(shù)為模糊半徑,越大越模糊宇整。 第二個(gè)參數(shù)是陰影離開(kāi)文字的x橫向距離瓶佳。 第三個(gè)參數(shù)是陰影離開(kāi)文字的Y橫向距離。 第四個(gè)參數(shù)是陰影顏色鳞青。
  • setTextSize:設(shè)置字體大小
  • setStyle:設(shè)置畫(huà)筆風(fēng)格霸饲,空心或?qū)嵭?/li>
setStyle的三個(gè)Paint.Style參數(shù):
  • Paint.Style.FILL:繪制的幾何圖形和文本將會(huì)被填充,忽略了在paint里設(shè)置的與stroke相關(guān)的屬性臂拓;
  • Paint.Style. STROKE:繪制的幾何圖形和文本將會(huì)被畫(huà)筆進(jìn)行繪制厚脉,遵從在paint里設(shè)置的與stroke相關(guān)的屬性(例如 setStrokeWidth()、setStrokeJoin()中所設(shè)置的屬性)胶惰;
  • Paint.Style.FILL_AND_STROKE:同時(shí)應(yīng)用前面兩種風(fēng)格進(jìn)行繪制傻工。
    所以Paint.Style.FILL和Paint.Style.STROKE最大的區(qū)別應(yīng)該是,前者指的是將幾何體或文本填充滿(mǎn)孵滞,而后者著重的是用筆一樣的畫(huà)中捆,強(qiáng)調(diào)的是一種線條,當(dāng)然這種線條可以設(shè)置粗細(xì)坊饶,所以后者常常跟paint.setStrokeWidth()一起使用泄伪。

Canvas

Canvas中細(xì)化的內(nèi)容相對(duì)較多,這里就繪制一些常規(guī)的圖像效果做個(gè)筆記匿级。還有關(guān)于canvas.rotate,translate的理解蟋滴,canvas的save()和restore(),restoreToCount()根蟹。其他常用的還有saveLayer()在另一篇筆記介紹脓杉;

  • 先說(shuō)一下canvas.rotate(),只要記住2點(diǎn)就可以了:

    1. 每個(gè)canvas.draw()方法都在新畫(huà)布繪制圖形简逮,最后呈現(xiàn)的效果是多個(gè)畫(huà)布(每次draw就有一個(gè)畫(huà)布)疊加的結(jié)果;
    2. rotate尿赚,translate方法會(huì)使坐標(biāo)軸發(fā)生變化散庶,畫(huà)布方向沒(méi)有變化蕉堰。
  • canvas.save();和canvas.restore();是兩個(gè)相互匹配出現(xiàn)的,作用是用來(lái)保存畫(huà)布的狀態(tài)和取出保存的狀態(tài)的悲龟。 當(dāng)我們對(duì)畫(huà)布進(jìn)行旋轉(zhuǎn)屋讶,縮放,平移等操作的時(shí)候其實(shí)我們是想對(duì)特定的元素進(jìn)行操作须教,比如圖片皿渗,一個(gè)矩形等,但是當(dāng)你用canvas的方法來(lái)進(jìn)行這些操作的時(shí)候轻腺,其實(shí)是對(duì)整個(gè)畫(huà)布進(jìn)行了操作乐疆,那么之后在畫(huà)布上的元素都會(huì)受到影響,所以我們?cè)诓僮髦罢{(diào)用canvas.save()來(lái)保存畫(huà)布當(dāng)前的狀態(tài)贬养,當(dāng)操作之后取出之前保存過(guò)的狀態(tài)挤土,這樣就不會(huì)對(duì)其他的元素進(jìn)行影響。

  • 繪制點(diǎn)

      // 點(diǎn)的坐標(biāo) x0,y0,x1,y1......
      float[] pts = { 50, 50, 100, 100, 200, 200, 300, 300, 0, 100, 100, 0 };
      canvas.drawPoints(pts, paint);
      // 繪制點(diǎn)的時(shí)候误算,隔著幾個(gè)點(diǎn)繪制幾個(gè)仰美,最多不到多少點(diǎn)
      canvas.drawPoints(pts, 1, 6, paint); 
    
  • 繪制線

      // x0,y0,x1,y1
      float[] pts = { 100, 100, 200, 200, 200, 200, 300, 200, 300, 200, 300, 400 };
      // 以上是6個(gè)點(diǎn)的x,y坐標(biāo),兩兩連成線段
      canvas.drawLines(pts, paint);
      //畫(huà)出一根線  
      canvas.drawLine(0, 0, 200, 200, paint);  
    
  • 繪制矩形

      //畫(huà)矩形  
      canvas.drawRect(200, 500, 300, 300, paint);  
    
  • 繪制圓

      //畫(huà)圓  
      canvas.drawCircle(200, 200, 100, paint);  
    
  • 繪制字符串

      //畫(huà)出字符串 drawText(String text, float x, float y, Paint paint)   
      // y 是 基準(zhǔn)線 儿礼,不是 字符串的 底部  
      canvas.drawText("apple", 60, 60, paint);  
      //將文字設(shè)置到指定路徑上
      Path path = new Path();
      paint.setTextSize(50);
      path.addCircle(200, 200, 150, Direction.CCW);
      canvas.drawTextOnPath("android", path, 0, 0, paint);
    
  • 繪制圓弧

      //指定放置圓弧的矩形
      RectF oval=new RectF(10,10,210,210);
      //繪制圓弧-0是指開(kāi)始度數(shù)咖杂,270是指結(jié)束度數(shù) false是指不連接圓心,paint是畫(huà)筆
      canvas.drawArc(oval, 0, 270, false, paint);
    
  • 繪制橢圓

      //指定矩形蚊夫,指定畫(huà)筆  
      canvas.drawOval(oval, paint);
    
  • 繪制圖片

      //繪制圖片  
      canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), 150, 150, paint);  
    
  • 二階貝塞爾曲線

      mPath.reset();
      //起點(diǎn)
      mPath.moveTo(startPoint.x, startPoint.y);
      //mPath
      mPath.quadTo(assistPoint.x, assistPoint.y, endPoint.x, endPoint.y);
      //畫(huà)path
      canvas.drawPath(mPath, mPaint);
    
  • 三階貝塞爾曲線

      //起點(diǎn)
      mPath.moveTo(startPoint.x, startPoint.y);
      //mPath
      mPath.cubicTo(assistPoint1.x, assistPoint1.y, assistPoint2.x, assistPoint2.y, endPoint.x, endPoint.y);
      //畫(huà)path
      canvas.drawPath(mPath, mPaint);
    

Path

剛剛繪制貝塞爾曲線時(shí)用到了path翰苫,這里對(duì)path也做一下基本筆記;關(guān)于path.setXfermode(new PorterDuffXfermode())和PathMearsure這里沒(méi)做筆記这橙,以后有時(shí)間補(bǔ)充奏窑,這篇只是記錄最為基礎(chǔ)的用法。

1.基本繪圖方法
  • addArc(RectF oval, float startAngle, float sweepAngle)
    繪制弧線,配合Paint的Style可以實(shí)現(xiàn)不同的填充效果
  • addCircle(float x, float y, float radius, Path.Direction dir)
    繪制圓形,其中第dir參數(shù)用來(lái)指定繪制時(shí)是順時(shí)針還是逆時(shí)針
  • addOval(RectF oval, Path.Direction dir)
    繪制橢圓形屈扎,其中 oval作為橢圓的外切矩形區(qū)域
  • addRect(RectF rect, Path.Direction dir)繪制矩形
  • addRoundRect(RectF rect, float rx, float ry, Path.Direction dir)繪制圓角矩形
  • lineTo(float x, float y) 繪制直線埃唯,和canvas.drawLine實(shí)現(xiàn)相同效果
  • addPath(Path src)添加一個(gè)新的Path到當(dāng)前Path
  • arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)
    與addArc方法相似,但也有區(qū)別鹰晨。
  • quadTo(float x1, float y1, float x2, float y2)
    繪制二次貝塞爾曲線,其中 (x1,y1)為控制點(diǎn)墨叛,(x2,y2)為終點(diǎn)
  • cubicTo(float x1, float y1, float x2, float y2, float x3, float y3)
    繪制三次貝塞爾曲線,其中(x1,y1),(x2,y2)為控制點(diǎn)模蜡,(x3,y3)為終點(diǎn)
2.rXXX方法

上面的lineTo,MoveTo,QuadTo,CubicTo方法都有與之對(duì)應(yīng)的rXXX方法:

rLineTo(float dx, float dy)
rMoveTo(float dx, float dy)
rQuadTo(float dx1, float dy1, float dx2, float dy2)
rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3)

這些方法與之對(duì)應(yīng)的原方法相比漠趁,惟一的區(qū)別在于:r方法是基于當(dāng)前繪制開(kāi)始點(diǎn)的offest,比如當(dāng)前paint位于 (100,100)處,則使用rLineTo(100,100)方法繪制出來(lái)的直線是從(100,100)到(200,200)的一條直接忍疾,由此可見(jiàn)rXXX方法方便用來(lái)基于之前的繪制作連續(xù)繪制闯传。

3.Path.op方法
//原型
op(Path path, Path.Op op)
//eg
path1.op(path2,Path.Op.DIFFERENCE);

此方法用于對(duì)兩個(gè)Path對(duì)象做相應(yīng)的運(yùn)算組合(combine),具體的說(shuō)是根據(jù)不同的op參數(shù)及path2參數(shù)來(lái)影響path1對(duì)象,有點(diǎn)類(lèi)似于數(shù)學(xué)上的集合運(yùn)算卤妒。如:

    eg:
    Path path1 = new Path();
    path1.addCircle(150, 150, 100, Path.Direction.CW);
    Path path2 = new Path();
    path2.addCircle(200, 200, 100, Path.Direction.CW);
    path1.op(path2, Path.Op.DIFFERENCE);
    canvas.drawPath(path1, paint1);

    Path.Op.DIFFERENCE 減去path1中path1與path2都存在的部分;
    path1 = (path1 - path1 ∩ path2)
    Path.Op.INTERSECT 保留path1與path2共同的部分;
    path1 = path1 ∩ path2
    Path.Op.UNION 取path1與path2的并集;
    path1 = path1 ∪ path2
    Path.Op.REVERSE_DIFFERENCE 與DIFFERENCE剛好相反;
    path1 = path2 - (path1 ∩ path2)
    Path.Op.XOR 與INTERSECT剛好相反;
    path1 = (path1 ∪ path2) - (path1 ∩ path2)
4.addArc 與 arcTo

前者指定在某處畫(huà)一條弧線甥绿,僅此而已字币,不會(huì)受當(dāng)前paint的位置所影響。而arcTo方法有兩種形式:

arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)

arcTo(RectF oval, float startAngle, float sweepAngle)

對(duì)于第一種形式的方法共缕,若forceMoveTo參數(shù)為false洗出,則與第二種形式的方法沒(méi)區(qū)別,繪制成的最終圖形會(huì)受到落筆點(diǎn)的影響图谷,可以劃出個(gè)扇形翩活;
若forceMoveTo參數(shù)值為true,則繪制效果與addArc方法沒(méi)有區(qū)別便贵。

5.reset 與 rewind

reset清除path上的內(nèi)容菠镇,重置path到 path = new Path()的初始狀態(tài)。
rewind清除path上的內(nèi)容嫉沽,但會(huì)保留path上相關(guān)的數(shù)據(jù)結(jié)構(gòu)辟犀,以高效的復(fù)用。

6.其它方法
moveTo(float x,float y)
移動(dòng)畫(huà)筆到 (x,y) 處
offset(float dx, float dy)
平移當(dāng)前path,在此path上繪制的任何圖形都會(huì)受到影響
close()
閉合當(dāng)前路徑 (系統(tǒng)會(huì)自動(dòng)從起點(diǎn)到終點(diǎn)繪制一條直線绸硕,使當(dāng)前路徑閉合)
reset()
重置path,但不會(huì)重置fill-type設(shè)置
rewind()
重置path,但會(huì)保留內(nèi)部數(shù)據(jù)結(jié)構(gòu)
set(Path src)
設(shè)置新的Path到當(dāng)前對(duì)象
setLastPoint(float x,float y)
設(shè)置當(dāng)前path的終點(diǎn)
transform(Matrix matrix)
矩陣變換

setFillType待研究

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末堂竟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玻佩,更是在濱河造成了極大的恐慌出嘹,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咬崔,死亡現(xiàn)場(chǎng)離奇詭異税稼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)垮斯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)郎仆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人兜蠕,你說(shuō)我怎么就攤上這事扰肌。” “怎么了熊杨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵曙旭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我晶府,道長(zhǎng)桂躏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任川陆,我火速辦了婚禮剂习,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己进倍,他們只是感情好土至,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布购对。 她就那樣靜靜地躺著猾昆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骡苞。 梳的紋絲不亂的頭發(fā)上垂蜗,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音解幽,去河邊找鬼贴见。 笑死,一個(gè)胖子當(dāng)著我的面吹牛躲株,可吹牛的內(nèi)容都是我干的片部。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼霜定,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼档悠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起望浩,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辖所,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后磨德,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缘回,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年典挑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酥宴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡您觉,死狀恐怖拙寡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顾犹,我是刑警寧澤倒庵,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站炫刷,受9級(jí)特大地震影響擎宝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浑玛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一绍申、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦极阅、人聲如沸胃碾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仆百。三九已至,卻和暖如春奔脐,著一層夾襖步出監(jiān)牢的瞬間俄周,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工髓迎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留峦朗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓排龄,卻偏偏與公主長(zhǎng)得像波势,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橄维,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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