日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android path平移,安卓自定义View进阶:Path基本操作(下)

發布時間:2024/1/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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基本操作(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。