android path平移,安卓自定义View进阶:Path基本操作(下)
(點擊上方公眾號,可快速關注)
來源:伯樂在線專欄作者 -GcsSloop
鏈接:http://android.jobbole.com/83384/
接上文
第二類(Path)
方法預覽:
// 第二類(Path)
// path
publicvoidaddPath(Pathsrc)
publicvoidaddPath(Pathsrc,floatdx,floatdy)
publicvoidaddPath(Pathsrc,Matrixmatrix)
這個相對比較簡單,也很容易理解,就是將兩個Path合并成為一個。
第三個方法是將src添加到當前path之前先使用Matrix進行變換。
第二個方法比第一個方法多出來的兩個參數是將src進行了位移之后再添加進當前path中。
示例:
canvas.translate(mWidth/2,mHeight/2);// 移動坐標系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();
Pathsrc=newPath();
path.addRect(-200,-200,200,200,Path.Direction.CW);
src.addCircle(0,0,100,Path.Direction.CW);
path.addPath(src,0,200);
mPaint.setColor(Color.BLACK);// 繪制合并后的路徑
canvas.drawPath(path,mPaint);
首先我們新建地方兩個Path(矩形和圓形)中心都是坐標原點,我們在將包含圓形的path添加到包含矩形的path之前將其進行移動了一段距離,最終繪制出來的效果就如上面所示。
第三類(addArc與arcTo)
方法預覽:
// 第三類(addArc與arcTo)
// addArc
publicvoidaddArc(RectFoval,floatstartAngle,floatsweepAngle)
// arcTo
publicvoidarcTo(RectFoval,floatstartAngle,floatsweepAngle)
publicvoidarcTo(RectFoval,floatstartAngle,floatsweepAngle,booleanforceMoveTo)
從名字就可以看出,這兩個方法都是與圓弧相關的,作用都是添加一個圓弧到path中,但既然存在兩個方法,兩者之間肯定是有區別的:
名稱
作用
區別
addArc
添加一個圓弧到path
直接添加一個圓弧到path中
arcTo
添加一個圓弧到path
添加一個圓弧到path,如果圓弧的起點和上次最后一個坐標點不相同,就連接兩個點
可以看到addArc有1個方法(實際上是兩個的,但另一個重載方法是API21添加的), 而arcTo有2個方法,其中一個最后多了一個布爾類型的變量forceMoveTo。
forceMoveTo是什么作用呢?
這個變量意思為“是否強制使用moveTo”,也就是說,是否使用moveTo將變量移動到圓弧的起點位移,也就意味著:
forceMoveTo
含義
等價方法
true
將最后一個點移動到圓弧起點,即不連接最后一個點與圓弧起點
public void addArc (RectF oval, float startAngle, float sweepAngle)
false
不移動,而是連接最后一個點與圓弧起點
public void arcTo (RectF oval, float startAngle, float sweepAngle)
示例(addArc):
canvas.translate(mWidth/2,mHeight/2);// 移動坐標系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();
path.lineTo(100,100);
RectFoval=newRectF(0,0,300,300);
path.addArc(oval,0,270);
// path.arcTo(oval,0,270,true);???????????? //
canvas.drawPath(path,mPaint);
示例(arcTo):
canvas.translate(mWidth/2,mHeight/2);// 移動坐標系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();
path.lineTo(100,100);
RectFoval=newRectF(0,0,300,300);
path.arcTo(oval,0,270);
// path.arcTo(oval,0,270,false);???????????? //
canvas.drawPath(path,mPaint);
從上面兩張運行效果圖可以清晰的看出來兩者的區別,我就不再廢話了。
第3組:isEmpty、 isRect、isConvex、 set 和 offset
這一組比較簡單,稍微說一下就可以了。
isEmpty
方法預覽:
publicbooleanisEmpty()
判斷path中是否包含內容。
Pathpath=newPath();
Log.e("1",path.isEmpty()+"");
path.lineTo(100,100);
Log.e("2",path.isEmpty()+"");
log輸出結果:
03-0214:22:54.77012379-12379/com.sloop.canvasE/1:true
03-0214:22:54.77012379-12379/com.sloop.canvasE/2:false
isRect
方法預覽:
publicbooleanisRect(RectFrect)
判斷path是否是一個矩形,如果是一個矩形的話,會將矩形的信息存放進參數rect中。
path.lineTo(0,400);
path.lineTo(400,400);
path.lineTo(400,0);
path.lineTo(0,0);
RectFrect=newRectF();
booleanb=path.isRect(rect);
Log.e("Rect","isRect:"+b+"| left:"+rect.left+"| top:"+rect.top+"| right:"+rect.right+"| bottom:"+rect.bottom);
log 輸出結果:
03-0216:48:39.66924179-24179/com.sloop.canvasE/Rect:isRect:true|left:0.0|top:0.0|right:400.0|bottom:400.0
set
方法預覽:
publicvoidset(Pathsrc)
將新的path賦值到現有path。
canvas.translate(mWidth/2,mHeight/2);// 移動坐標系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();// path添加一個矩形
path.addRect(-200,-200,200,200,Path.Direction.CW);
Pathsrc=newPath();// src添加一個圓
src.addCircle(0,0,100,Path.Direction.CW);
path.set(src);// 大致相當于 path = src;
canvas.drawPath(path,mPaint);
offset
方法預覽:
publicvoidoffset(floatdx,floatdy)
publicvoidoffset(floatdx,floatdy,Pathdst)
這個的作用也很簡單,就是對path進行一段平移,它和Canvas中的translate作用很像,但Canvas作用于整個畫布,而path的offset只作用于當前path。
但是第二個方法最后怎么會有一個path作為參數?
其實第二個方法中最后的參數das是存儲平移后的path的。
dst狀態
效果
dst不為空
將當前path平移后的狀態存入dst中,不會影響當前path
dat為空(null)
平移將作用于當前path,相當于第一種方法
示例:
canvas.translate(mWidth/2,mHeight/2);// 移動坐標系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();// path中添加一個圓形(圓心在坐標原點)
path.addCircle(0,0,100,Path.Direction.CW);
Pathdst=newPath();// dst中添加一個矩形
dst.addRect(-200,-200,200,200,Path.Direction.CW);
path.offset(300,0,dst);// 平移
canvas.drawPath(path,mPaint);// 繪制path
mPaint.setColor(Color.BLUE);// 更改畫筆顏色
canvas.drawPath(dst,mPaint);// 繪制dst
從運行效果圖可以看出,雖然我們在dst中添加了一個矩形,但是并沒有表現出來,所以,當dst中存在內容時,dst中原有的內容會被清空,而存放平移后的path。
三.總結
本想一篇把path寫完,但是萬萬沒想到居然扯了這么多。本篇中講解的是直線部分和一些常用方法,下一篇將著重講解貝塞爾曲線和自相交圖形渲染等相關問題,敬請期待哦。
學完本篇之后又解鎖了新的境界,可以看看這位大神的文章 Android雷達圖(蜘蛛網圖)繪制
這個精小干練,非常適合新手練習使用,幫助大家更好的熟悉path的使用。
(,,? ? ?,,)
參考資料
Path
Canvas
android繪圖之Path總結
GcsSloop:搜索GcsSloop,發現更多精彩。
打賞支持作者寫出更多好文章,謝謝!
總結
以上是生活随笔為你收集整理的android path平移,安卓自定义View进阶:Path基本操作(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android原生接入rn,Androi
- 下一篇: vb怎么抓取html的class,vbs