日韩性视频-久久久蜜桃-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基本操作(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 91 高清 在线 制服 偷拍 | 亚洲欧美偷拍一区 | 国产精品一区二区三区四区五区 | 激情丁香网 | 亚洲在线一区 | 色资源av | 一区影视 | 一区二区三区日韩精品 | 国产国语videosex另类 | 欧美久久一区 | 中国成熟妇女毛茸茸 | 久久视频中文字幕 | 深夜福利国产精品 | 91在线一区二区三区 | 香蕉网久久 | 老汉av| 国产91国语对白在线 | 国产精品国产精品国产 | 亚洲精品白虎 | 亚洲毛茸茸 | 红猫大本营在线观看的 | 91国在线 | 一级视频黄色 | 亚洲另类av | 懂色av一区二区夜夜嗨 | 一本久久精品一区二区 | 538国产精品视频一区二区 | 国产在线精品成人欧美 | 99久久99久久久精品棕色圆 | 女女同性高清片免费看 | 国产三级做爰高清在线 | www.av黄色 | 2018天天干天天操 | 冈本视频在线观看 | 在线观看av大片 | www.射| 大奶一区| 不卡av免费 | 中文在线观看av | 天堂国产精品 | 福利午夜视频 | 国产精品二三区 | 欧美在线一级片 | 97国产高清 | 国产乱码精品一区二区三区精东 | 日韩精品一区二区亚洲av观看 | 国产成人a人亚洲精品无码 在线aa | 亚洲性xxx| 精品亚洲在线 | 69色| 精品国产鲁一鲁一区二区三区 | 国产a视频免费观看 | 一级性视频| 黄色免费视频 | 欧美精品久久久久久久久老牛影院 | 国产一区二区在 | 婷婷综合网 | 国产99视频在线观看 | av成人精品 | 久久白虎| 国产精品欧美一区喷水 | 亚洲欧美日韩高清 | 亚洲av永久无码国产精品久久 | 日韩免费av网站 | 伊人久久麻豆 | np视频| 久久久久国产精品区片区无码 | 国产白丝精品91爽爽久久 | 欧美交换配乱吟粗大25p | 免费久久视频 | 欧美成人黄 | 性色av网站 | 天堂在线日本 | 久久久久久久久久久97 | 天堂一区在线观看 | 久久亚洲国产成人精品性色 | 国产女人在线 | 国产高清一区在线观看 | 99久久久久久久久久 | 亚洲一区在线播放 | 久久久www免费人成人片 | 超碰资源总站 | 99九九久久 | 床戏高潮做进去大尺度视频网站 | 久久婷综合 | 天堂一区二区三区四区 | 国产精品久久久久久网站 | 中文字幕av观看 | 黄色大片视频 | 人妻一区二区视频 | 国产免费久久久 | av亚洲在线观看 | 中文字幕三区 | 狠狠干夜夜草 | 色骚网 | 亚洲在线观看一区 | 日韩在线高清视频 | 亚洲一级理论片 | 任你操精品视频 |