★60.自定義控件 ★08.Path之基本操作

第1組: moveTo、 setLastPoint必孤、 lineTo 和 close

畫筆

Paint mPaint = new Paint();             // 創(chuàng)建畫筆
mPaint.setColor(Color.BLACK);           // 畫筆顏色 - 黑色
mPaint.setStyle(Paint.Style.STROKE);    // 填充模式 - 描邊
mPaint.setStrokeWidth(10);              // 邊框寬度 - 10

lineTo

方法

public void lineTo (float x, float y)

示例

canvas.translate(mWidth / 2, mHeight / 2);  // 移動坐標系到屏幕中心(寬高數(shù)據(jù)在onSizeChanged中獲取)

Path path = new Path();                     // 創(chuàng)建Path

path.lineTo(200, 200);                      // lineTo
path.lineTo(200,0);

canvas.drawPath(path, mPaint);              // 繪制Path

lineTo的默認點為坐標原點。


moveTo 和 setLastPoint

區(qū)別

方法名 簡介 是否影響之前的操作 是否影響之后操作
moveTo 移動下一次操作的起點位置
setLastPoint 設置之前操作的最后一個點位置

方法

// moveTo
public void moveTo (float x, float y)

// setLastPoint
public void setLastPoint (float dx, float dy)

moveTo示例

canvas.translate(mWidth / 2, mHeight / 2);  // 移動坐標系到屏幕中心
Path path = new Path();                     // 創(chuàng)建Path
path.lineTo(200, 200);                      // lineTo
path.moveTo(200,100);                       // moveTo
path.lineTo(200,0);                         // lineTo
canvas.drawPath(path, mPaint);              // 繪制Path

setLastPoint示例

canvas.translate(mWidth / 2, mHeight / 2);  // 移動坐標系到屏幕中心
Path path = new Path();                     // 創(chuàng)建Path
path.lineTo(200, 200);                      // lineTo
path.setLastPoint(200,100);                 // setLastPoint
path.lineTo(200,0);                         // lineTo
canvas.drawPath(path, mPaint);              // 繪制Path

close

方法

public void close ()

示例

canvas.translate(mWidth / 2, mHeight / 2);  // 移動坐標系到屏幕中心
Path path = new Path();                     // 創(chuàng)建Path
path.lineTo(200, 200);                      // lineTo
path.lineTo(200,0);                         // lineTo
path.close();                               // close
canvas.drawPath(path, mPaint);              // 繪制Path

第2組: add*與arcTo

第一類(基本形狀)

方法

// 圓形
public void addCircle (float x, float y, float radius, Path.Direction dir)
// 橢圓
public void addOval (RectF oval, Path.Direction dir)
// 矩形
public void addRect (float left, float top, float right, float bottom, Path.Direction dir)
public void addRect (RectF rect, Path.Direction dir)
// 圓角矩形
public void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
public void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)

Path.Direction

類型

類型 解釋 翻譯
CW clockwise 順時針
CCW counter-clockwise 逆時針

作用

序號 作用
1 在添加圖形時確定閉合順序(各個點的記錄順序)
2 對圖形的渲染結果有影響(是判斷圖形渲染的重要條件)

矩形示例

canvas.translate(mWidth / 2, mHeight / 2);  // 移動坐標系到屏幕中心
Path path = new Path();
path.addRect(-200,-200,200,200, Path.Direction.CW);
canvas.drawPath(path,mPaint);

其中Path.Direction影響的是點的繪制順序瑞躺,平常無區(qū)別敷搪,但是對于進行setLastPoint這些 點順序會影響結果的操作會顯示出區(qū)別。


第二類(Path)

方法

public void addPath (Path src)
// 將src進行了位移之后再添加進當前path中幢哨。
public void addPath (Path src, float dx, float dy)
// 將src添加到當前path之前先使用Matrix進行變換赡勘。
public void addPath (Path src, Matrix matrix)

第三類(addArc與arcTo)

方法

// addArc
public void addArc (RectF oval, float startAngle, float sweepAngle)
// arcTo
public void arcTo (RectF oval, float startAngle, float sweepAngle)
public void arcTo (RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)

參數(shù)

參數(shù) 摘要
oval 圓弧的外切矩形。
startAngle 開始角度
sweepAngle 掃過角度(-360 <= sweepAngle <360)
forceMoveTo 是否強制使用MoveTo
forceMoveTo 含義 等價方法
true 將最后一個點移動到圓弧起點嘱么,即不連接最后一個點與圓弧起點 public void addArc (RectF oval, float startAngle, float sweepAngle)
false 不移動狮含,而是連接最后一個點與圓弧起點 public void arcTo (RectF oval, float startAngle, float sweepAngle)

sweepAngle取值范圍是 [-360, 360)顽悼,不包括360曼振,當 >= 360 或者 < -360 時將不會繪制任何內容, 對于360蔚龙,你可以用一個接近的值替代冰评,例如: 359.99。

區(qū)別

名稱 作用 區(qū)別
addArc 添加一個圓弧到path 直接添加一個圓弧到path中
arcTo 添加一個圓弧到path 添加一個圓弧到path木羹,如果圓弧的起點和上次最后一個坐標點不相同甲雅,就連接兩個點

示例(addArc)

canvas.translate(mWidth / 2, mHeight / 2);  // 移動坐標系到屏幕中心
canvas.scale(1,-1);                         // <-- 注意 翻轉y坐標軸

Path path = new Path();
path.lineTo(100,100);

RectF oval = new RectF(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);                         // <-- 注意 翻轉y坐標軸
Path path = new Path();
path.lineTo(100,100);
RectF oval = new RectF(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

// 判斷path中是否包含內容
public boolean isEmpty ()

isRect

方法

public boolean isRect (RectF rect)

示例

path.lineTo(0,400);
path.lineTo(400,400);
path.lineTo(400,0);
path.lineTo(0,0);

RectF rect = new RectF();
boolean b = path.isRect(rect);
Log.e("Rect","isRect:"+b+"| left:"+rect.left+"| top:"+rect.top+"| right:"+rect.right+"| bottom:"+rect.bottom);

set

方法

// 將新的path賦值到現(xiàn)有path
public void set (Path src)

offset

// 對path進行一段平移弛姜,它和Canvas中的translate作用很像,但Canvas作用于整個畫布妖枚,而path的offset只作用于當前path
public void offset (float dx, float dy)
public void offset (float dx, float dy, Path dst)
dst狀態(tài) 效果
dst不為空 將當前path平移后的狀態(tài)存入dst中廷臼,不會影響當前path
dst為空(null) 平移將作用于當前path,相當于第一種方法

第4組:r*方法

r*方法的坐標使用的是相對位置(基于當前點的位移)绝页,而之前方法的坐標是絕對位置(基于當前坐標系的坐標)荠商。

Path path = new Path();
path.moveTo(100,100);
path.rLineTo(100,200);
canvas.drawPath(path,mDeafultPaint);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市续誉,隨后出現(xiàn)的幾起案子莱没,更是在濱河造成了極大的恐慌,老刑警劉巖酷鸦,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饰躲,死亡現(xiàn)場離奇詭異,居然都是意外死亡臼隔,警方通過查閱死者的電腦和手機属铁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躬翁,“玉大人焦蘑,你說我怎么就攤上這事『蟹ⅲ” “怎么了例嘱?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宁舰。 經(jīng)常有香客問我拼卵,道長,這世上最難降的妖魔是什么蛮艰? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任腋腮,我火速辦了婚禮,結果婚禮上壤蚜,老公的妹妹穿的比我還像新娘即寡。我一直安慰自己,他們只是感情好袜刷,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布聪富。 她就那樣靜靜地躺著,像睡著了一般著蟹。 火紅的嫁衣襯著肌膚如雪墩蔓。 梳的紋絲不亂的頭發(fā)上梢莽,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音奸披,去河邊找鬼昏名。 笑死,一個胖子當著我的面吹牛阵面,可吹牛的內容都是我干的葡粒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼膜钓,長吁一口氣:“原來是場噩夢啊……” “哼嗽交!你這毒婦竟也來了?” 一聲冷哼從身側響起颂斜,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤夫壁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沃疮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盒让,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年司蔬,在試婚紗的時候發(fā)現(xiàn)自己被綠了邑茄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡俊啼,死狀恐怖肺缕,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情授帕,我是刑警寧澤同木,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站跛十,受9級特大地震影響彤路,放射性物質發(fā)生泄漏。R本人自食惡果不足惜芥映,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一洲尊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奈偏,春花似錦坞嘀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榛做。三九已至唁盏,卻和暖如春内狸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厘擂。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工昆淡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刽严。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓昂灵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舞萄。 傳聞我的和親對象是個殘疾皇子眨补,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容