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