View之Paint、Canvas、Path筆記

Paint

屬性配置

  • setAntiAlias:抗鋸齒
  • setDither:抗抖動(dòng)
  • setColor,setARGB,setAlpha:顏色和顯示
  • setShadowLayer(10f, 11f,5f, Color.YELLOW); 第一個(gè)參數(shù)為模糊半徑,越大越模糊。 第二個(gè)參數(shù)是陰影離開文字的x橫向距離。 第三個(gè)參數(shù)是陰影離開文字的Y橫向距離。 第四個(gè)參數(shù)是陰影顏色。
  • setTextSize:設(shè)置字體大小
  • setStyle:設(shè)置畫筆風(fēng)格,空心或?qū)嵭?/li>
setStyle的三個(gè)Paint.Style參數(shù):
  • Paint.Style.FILL:繪制的幾何圖形和文本將會(huì)被填充,忽略了在paint里設(shè)置的與stroke相關(guān)的屬性;
  • Paint.Style. STROKE:繪制的幾何圖形和文本將會(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)該是,前者指的是將幾何體或文本填充滿,而后者著重的是用筆一樣的畫,強(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()方法都在新畫布繪制圖形,最后呈現(xiàn)的效果是多個(gè)畫布(每次draw就有一個(gè)畫布)疊加的結(jié)果;
    2. rotate,translate方法會(huì)使坐標(biāo)軸發(fā)生變化,畫布方向沒(méi)有變化。
  • canvas.save();和canvas.restore();是兩個(gè)相互匹配出現(xiàn)的,作用是用來(lái)保存畫布的狀態(tài)和取出保存的狀態(tài)的。 當(dāng)我們對(duì)畫布進(jìn)行旋轉(zhuǎn),縮放,平移等操作的時(shí)候其實(shí)我們是想對(duì)特定的元素進(jìn)行操作,比如圖片,一個(gè)矩形等,但是當(dāng)你用canvas的方法來(lái)進(jìn)行這些操作的時(shí)候,其實(shí)是對(duì)整個(gè)畫布進(jìn)行了操作,那么之后在畫布上的元素都會(huì)受到影響,所以我們?cè)诓僮髦罢{(diào)用canvas.save()來(lái)保存畫布當(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);
      //畫出一根線  
      canvas.drawLine(0, 0, 200, 200, paint);  
    
  • 繪制矩形

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

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

      //畫出字符串 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是指開始度數(shù),270是指結(jié)束度數(shù) false是指不連接圓心,paint是畫筆
      canvas.drawArc(oval, 0, 270, false, paint);
    
  • 繪制橢圓

      //指定矩形,指定畫筆  
      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);
      //畫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);
      //畫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)前繪制開始點(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)類似于數(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ì)受當(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)畫筆到 (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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容