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)就可以了:
- 每個(gè)canvas.draw()方法都在新畫(huà)布繪制圖形简逮,最后呈現(xiàn)的效果是多個(gè)畫(huà)布(每次draw就有一個(gè)畫(huà)布)疊加的結(jié)果;
- 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待研究