android path 详解
Path主要用于繪制復(fù)雜的圖形輪廓,比如折線,圓弧以及各種復(fù)雜圖案
方法列表:
reset() ? ? ? ? ? ? ? ? ? ? ? ? ??
lineTo(float x, float y)
moveTo(float x, float y)
close() path.addArc(oval, startAngle, sweepAngle) arcTo(RectF oval, float startAngle, float sweepAngle) quadTo(float x1, float y1, float x2, float y2) addCircle(float x, float y, float radius, Direction dir) addOval(RectF oval, Path.Direction dir) addPath(Path src, float dx, float dy)
Paint初始化操作:
在處理path之前,我們首先對(duì)paint做一些初始化操作:
Paint paint = new Paint(); paint.setColor(Color.RED); //設(shè)置畫(huà)筆寬度 paint.setStrokeWidth(3); //消除鋸齒 paint.setAntiAlias(true); //設(shè)置鏤空(方便查看效果) paint.setStyle(Style.STROKE);
path中從最基本的moveTo(float x, float y),lineTo(float x, float y),reset()及close()方法入手
reset()方法:
reset()清除path設(shè)置的所有屬性
lineTo(float x, float y)方法:
lineTo(float x, float y)方法用于從當(dāng)前輪廓點(diǎn)繪制一條線段到x,y點(diǎn):
從原點(diǎn)開(kāi)始繪制一條折線,代碼如下:
Path path = new Path(); path.lineTo(100,100); path.lineTo(100, 200); path.lineTo(150, 250); canvas.drawPath(path, paint);
??上圖中沒(méi)有指定初始輪廓點(diǎn),默認(rèn)從0,0點(diǎn)開(kāi)始
moveTo(float x, float y)方法:
path的moveTo方法將起始輪廓點(diǎn)移至x,y坐標(biāo)點(diǎn),默認(rèn)情況為0,0點(diǎn)
使用moveTo設(shè)置輪廓點(diǎn):代碼如下:
Path path = new Path();
path.moveTo(20, 200); path.lineTo(50, 200); path.lineTo(100, 300); path.lineTo(200, 350); canvas.drawPath(path, paint);
效果圖如下:?上圖使用moveTo改變path繪制起始頂點(diǎn)效果
close()方法:
回到初始點(diǎn)形成封閉的曲線
Path path = new Path();
path.moveTo(20, 200); path.lineTo(50, 200); path.lineTo(100, 300); path.lineTo(200, 350); path.close(); canvas.drawPath(path, paint);
效果圖如下:
?
addArc(RectF?oval, float startAngle, float sweepAngle)方法:
path.addArc方法用于繪制圓弧,這個(gè)圓弧取自RectF矩形的內(nèi)接橢圓上的一部分,圓弧長(zhǎng)度由后兩個(gè)參數(shù)決定
startAngle:起始位置的角度值
sweepAngle:旋轉(zhuǎn)的角度值
如圖所示:其中矩形和兩條直線是用來(lái)做對(duì)比
?
Rect rect = new Rect(100, 100, 300, 250); canvas.drawRect(rect, paint);
//繪制橢圓 canvas.drawOval(new RectF(rect), paint); canvas.drawLine(50, 175, 350, 175, paint); canvas.drawLine(200, 50, 200, 300, paint);
上圖中標(biāo)注了圓弧的0度起點(diǎn)和弧度增量方向?yàn)轫槙r(shí)針,那么當(dāng)我們截取其中的0-90的長(zhǎng)度圓弧對(duì)應(yīng)的是右下角的四分之一圓弧長(zhǎng)度:Rect rect = new Rect(100, 100, 300, 250); canvas.drawRect(rect, paint); //canvas.drawOval(new RectF(rect), paint); canvas.drawLine(50, 175, 350, 175, paint); canvas.drawLine(200, 50, 200, 300, paint); path.reset();
// path.addArc(new RectF(rect), 30, 60); canvas.drawPath(path, paint);
?arcTo(RectF oval, float startAngle, float sweepAngle)方法: arcTo和addArc的區(qū)別: 1. addArc可以直接加入一段橢圓弧。使用arcTo還需要使用moveTo指定當(dāng)前點(diǎn)的坐標(biāo)。 2. arcTo如果當(dāng)前點(diǎn)坐標(biāo)和曲線的起始點(diǎn)不是同一個(gè)點(diǎn)的話,還會(huì)自動(dòng)添加一條直線補(bǔ)齊路徑。
Rect rect = new Rect(100, 100, 300, 250); canvas.drawRect(rect, paint); canvas.drawLine(50, 175, 350, 175, paint); canvas.drawLine(200, 50, 200, 300, paint);Path path = new Path(); path.moveTo(0, 0); path.arcTo(new RectF(rect), 0, 90); //path.addArc(new RectF(rect), 0, 90); canvas.drawPath(path, paint);
效果圖:quadTo(float x1, float y1, float x2, float y2)方法: 以當(dāng)前路徑結(jié)束點(diǎn)為開(kāi)始點(diǎn),(x1,y1)為控制點(diǎn),(x2,y2)為結(jié)束點(diǎn)畫(huà)一條二次貝塞爾曲線(相關(guān)貝賽爾曲線請(qǐng)?jiān)僮霾樵?#xff09;
Path path = new Path();
path.moveTo(20, 50); path.lineTo(50, 200); path.quadTo(100, 200, 150, 250); canvas.drawPath(path, paint);
?addCircle(float x, float y, float radius, Direction dir)方法:
使用path繪制圓形,xy為圓的圓心 radius為圓的半徑,Direction 為繪制元的方向
Diection.CCW 逆時(shí)針?lè)较?/span>
Diection.CW 順時(shí)針?lè)较?/span>
Path path = new Path();
path.reset(); path.addCircle(100, 100, 50, Direction.CW); canvas.drawPath(path, paint);
?addOval(RectF oval, Path.Direction dir)方法:
繪制橢圓,同上繪制圓的方法
addPath(Path src, float dx, float dy)方法:
在已有的Path上通過(guò)平移創(chuàng)建新的path:
Path path = new Path(); path.lineTo(100,100); path.lineTo(100, 200); path.lineTo(150, 250);?
canvas.drawPath(path, paint); path.addPath(path, 100, 0); canvas.drawPath(path, paint);
?關(guān)于path的一些路徑特效下一章給出
玩過(guò)自定義View的小伙伴都知道,在View的繪制過(guò)程中,有一個(gè)類(lèi)叫做Path,Path可以幫助我們實(shí)現(xiàn)很多自定義形狀的View,特別是配合x(chóng)fermode屬性來(lái)使用的時(shí)候。OK,那我們今天就來(lái)看看Path中那幾個(gè)常用的API。
1.moveTo
moveTo表示將繪制點(diǎn)移動(dòng)到某一個(gè)坐標(biāo)處,該方法并不會(huì)進(jìn)行繪制,主要是用來(lái)移動(dòng)畫(huà)筆。默認(rèn)情況下起始坐標(biāo)位于(0,0)點(diǎn),我們可以手動(dòng)調(diào)整默認(rèn)位置。
2.lineTo
lineTo表示繪制一條直線,參數(shù)表示目標(biāo)坐標(biāo)如下:
[java] view plaincopyprint?顯示效果如下:
默認(rèn)情況下,起始點(diǎn)為(0,0)點(diǎn),如果我用moveTo將起始點(diǎn)坐標(biāo)移至(0,150),代碼如下:
[java] view plaincopyprint?3.quadTo
quadTo可以用來(lái)繪制一個(gè)帶控制點(diǎn)的曲線,說(shuō)白了,其實(shí)就是貝塞爾曲線。如下:
[java] view plaincopyprint?前兩個(gè)參數(shù)表示控制點(diǎn)的坐標(biāo),后兩個(gè)參數(shù)表示結(jié)束點(diǎn)的坐標(biāo):
4.cubicTo
cubicTo可以用來(lái)繪制具有兩個(gè)控制點(diǎn)的貝塞爾曲線,代碼如下:
[java] view plaincopyprint?前兩個(gè)參數(shù)表示第一個(gè)控制點(diǎn)的坐標(biāo),第三四個(gè)參數(shù)表示第二個(gè)控制點(diǎn)的坐標(biāo),第五六個(gè)參數(shù)表示最終的坐標(biāo)點(diǎn),顯示效果如下:
5.arcTo
artTo用來(lái)繪制一段圓弧,實(shí)際上是截取圓或者橢圓的一部分,比如下面一段代碼:
[java] view plaincopyprint?顯示效果如下:
該方法接收三個(gè)參數(shù),第一個(gè)表示弧形所在的矩形,如果矩形為正方形,則畫(huà)出的弧形為圓的一部分,如果矩形寬高不等,畫(huà)出的弧形為橢圓的一部分,第二個(gè)參數(shù)表示繪制的起點(diǎn)位置,0度為鐘表三點(diǎn)位置,第三個(gè)參數(shù)表示繪制的度數(shù)。看下面一段代碼:
[java] view plaincopyprint?顯示效果如下:
如上則是橢圓的一部分。
arcTo方法還有一個(gè)重載的方法,即接收四個(gè)參數(shù),最后一個(gè)參數(shù)表示是否將弧形的起點(diǎn)與上一個(gè)圖形的終點(diǎn)連接起來(lái),true表示不連接,false表示連接,默認(rèn)為false,如下一段代碼:
[java] view plaincopyprint?顯示效果如下:
如果我給第二條線再添加一個(gè)參數(shù)true,如下:
[java] view plaincopyprint?顯示效果如下:
這里有個(gè)坑,一定要運(yùn)行起來(lái)才有效果,編譯之后預(yù)覽看到的效果是錯(cuò)的。囧了個(gè)囧。。。。。
6.addArc、addRoundRect、addOval、addRect、addCircle
addArc,添加一個(gè)圓弧到路徑中,這個(gè)圓弧實(shí)為圓或者橢圓的一部分,如下一段代碼:
[java] view plaincopyprint?效果如下:
后面幾種效果我一起來(lái)展示,代碼如下:
[java] view plaincopyprint?顯示效果如下:
Direction參數(shù)表示方向,其中CW代表順時(shí)針,CCW代表逆時(shí)針。
7.Path.Op
Path中還有一個(gè)好用的Op屬性,這個(gè)屬性有點(diǎn)類(lèi)似于Paint中的xfermode屬性,可以用來(lái)組合兩個(gè)Path。用法有如下幾種:
7.1Path.Op.DIFFERENCE
Path.Op.DIFFERENCE表示從path中去除path2的部分,保留path的部分。如下案例:
[java] view plaincopyprint?顯示效果如下:
7.2Path.Op.INTERSECT
Path.Op.INTERSECT表示取path和path2相交的部分顯示出來(lái),如下:
[java] view plaincopyprint?顯示效果如下:
7.3Path.Op.REVERSE_DIFFERENCE
Path.Op.REVERSE_DIFFERENCE表示除去path的部分,只顯示path2的部分,如下:
[java] view plaincopyprint?顯示效果如下:
7.4Path.Op.UNION
Path.Op.UNION表示path和path2的部分都要顯示出來(lái),如下:
[java] view plaincopyprint?顯示效果如下:
7.5Path.Op.XOR
Path.Op.XOR表示顯示path和path2但是不包含二者的交集。如下:
[java] view plaincopyprint?顯示效果如下:
OK,以上就是對(duì)Path類(lèi)的一個(gè)簡(jiǎn)單介紹。
以上。
總結(jié)
以上是生活随笔為你收集整理的android path 详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通过 UserAgent 判断是否在我们
- 下一篇: include、ViewStub、mer