Android Path學(xué)習(xí)筆記

簡(jiǎn)單說(shuō)說(shuō)

<p>
??Path是android中用來(lái)封裝幾何學(xué)路徑的一個(gè)類化漆,因?yàn)镻ath在圖形繪制上占的比重還是相當(dāng)大的切油,所以經(jīng)過(guò)學(xué)習(xí)后贫导,對(duì)Path中方法進(jìn)行總結(jié)使用與應(yīng)用

Path類的方法

<p>

圖1 Path方法

Path中的方法相對(duì)較多烹玉,不對(duì)期進(jìn)行一一說(shuō)明叁幢,將平時(shí)用的較多的方法拿出來(lái)著重說(shuō)明

1) 將路徑連接至某個(gè)坐標(biāo)點(diǎn)

  lineTo(float x, float y)

**(2)改變起始點(diǎn)的位置 **

  moveTo(float x, float y)

(3)閉合路徑

  close() 

(4)路徑重置

  reset()

(5)畫弧形路徑

  arcTo(float left, float top, float right, float bottom, RectF oval, float startAngle, float     sweepAngle,boolean forceMoveTo)
  arcTo (RectF oval, float startAngle, float sweepAngle)
  arcTo (RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)

參數(shù)boolean forceMoveTo卖宠,當(dāng)值為true時(shí)將會(huì)把弧的起點(diǎn)作為Path的起點(diǎn)

(6)**addXXX方法 **直接往Path中添加一些曲線

添加矩形曲線

  addRect(RectF rect,Direction dir)
  addRect(float left, float top, float right, float bottom,Direction dir)

添加橢圓形曲線

  addOval(RectF oval,Direction dir)
  addOval(float left, float top, float right, float bottom,Direction dir)

添加圓形曲線

  addCircle(float x, float y, floatradius,Direction dir)

添加弧形曲線

  addArc(RectF oval, float startAngle, float sweepAngle)
  addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle)

添加圓角矩形曲線

  addRoundRect(RectF rect, float rx, float ry,Direction dir)
  addRoundRect(float left, float top, float right, float bottom, float rx, float ry,Direction dir)
  addRoundRect(RectF rect, float[] radii,Direction dir)
  addRoundRect(float left, float top, float right, float bottom, float[] radii,Direction dir)

添加path

  addPath(Path src, float dx, float dy)
  addPath(Path src)
  addPath(Path src,Matrix matrix)
而上面這些方法搭配一起就會(huì)碰撞出奇妙的火花

<p>
比如

圖2 Path繪制圖

亦或這個(gè)

圖3 Path繪制圖

還有這個(gè)

圖4 Path繪制圖

好吧我承認(rèn)這個(gè)是我畫的巍杈,確實(shí)比例有問(wèn)題。扛伍。筷畦。

也許很多人會(huì)覺得利用Path來(lái)繪制圖像代碼量很大而且需要計(jì)算的數(shù)據(jù)也很多,但是我覺得的基本用法還是需要了解也熟練使用的

接下來(lái)要介紹的則是Path中的大招刺洒,這個(gè)方法會(huì)帶來(lái)很多很贊的體驗(yàn)與設(shè)計(jì)

(7)貝塞爾曲線
<p>
什么是貝塞爾曲線就不做概述了鳖宾,簡(jiǎn)單說(shuō)就是只需要一個(gè)起點(diǎn)、一個(gè)終點(diǎn)和至少零個(gè)控制點(diǎn)則可定義一個(gè)貝賽爾曲線
<p>
一階貝賽爾曲線

圖5 一階貝塞爾曲線公式

其中B(t)為時(shí)間為t時(shí)點(diǎn)的坐標(biāo)逆航,P0為起點(diǎn)鼎文、Pn為終點(diǎn),曲線圖如下

圖6 一階貝塞爾曲線圖

二階貝塞爾曲線

二階貝賽爾曲線的一個(gè)明顯特征是其擁有一個(gè)控制點(diǎn)因俐,通過(guò)控制點(diǎn)來(lái)控制曲線的走向

圖7 二階貝塞爾曲線公式

對(duì)應(yīng)的二階曲線圖如下

圖8 二階貝塞爾曲線圖

在Android Path中存在對(duì)應(yīng)的方法來(lái)實(shí)現(xiàn)二階貝塞爾曲線

    quadTo(float x1, floaty1, float x2, float y2)  其中x1,y1為控制點(diǎn)拇惋,x2,y2為終點(diǎn)

利用好二階貝塞爾曲線其實(shí)可以玩轉(zhuǎn)出一些比較贊的效果了

比如下面的波浪效果

圖9 貝塞爾二階曲線實(shí)現(xiàn)的波浪效果

代碼實(shí)現(xiàn)角度也很簡(jiǎn)單
<p>

         /* 
         * 設(shè)置Path起點(diǎn) 
         * 注意我將Path的起點(diǎn)設(shè)置在了控件的外部看不到的區(qū)域 
         * 如果我們將起點(diǎn)設(shè)置在控件左端x=0的位置會(huì)使得貝塞爾曲線變得生硬 
         * 至于為什么剛才我已經(jīng)說(shuō)了 
         * 所以我們稍微讓起點(diǎn)往“外”走點(diǎn) 
         */  
        mPath.moveTo(-1 / 4F * vWidth, waveY);  
  
        /* 
         * 以二階曲線的方式通過(guò)控制點(diǎn)連接位于控件右邊的終點(diǎn) 
         * 終點(diǎn)的位置也是在控件外部 
         * 我們只需不斷讓ctrX的大小變化即可實(shí)現(xiàn)“浪”的效果 
         */  
        mPath.quadTo(ctrX, ctrY, vWidth + 1 / 4F * vWidth, waveY);  
  
        // 圍繞控件閉合曲線  
        mPath.lineTo(vWidth + 1 / 4F * vWidth, vHeight);  
        mPath.lineTo(-1 / 4F * vWidth, vHeight);  
        mPath.close();  
  
        canvas.drawPath(mPath, mPaint);  
  
        /* 
         * 當(dāng)控制點(diǎn)的x坐標(biāo)大于或等于終點(diǎn)x坐標(biāo)時(shí)更改標(biāo)識(shí)值 
         */  
        if (ctrX >= vWidth + 1 / 4F * vWidth) {  
            isInc = false;  
        }  
        /* 
         * 當(dāng)控制點(diǎn)的x坐標(biāo)小于或等于起點(diǎn)x坐標(biāo)時(shí)更改標(biāo)識(shí)值 
         */  
        else if (ctrX <= -1 / 4F * vWidth) {  
            isInc = true;  
        }  
  
        // 根據(jù)標(biāo)識(shí)值判斷當(dāng)前的控制點(diǎn)x坐標(biāo)是該加還是減  
        ctrX = isInc ? ctrX + 20 : ctrX - 20;  
  
        /* 
         * 讓“水”不斷減少 
         */  
        if (ctrY <= vHeight) {  
            ctrY += 2;  
            waveY += 2;  
        }  
  
        mPath.reset();  
  
        // 重繪  
        invalidate();  

主要通過(guò)控制控制點(diǎn)與終點(diǎn)的位置不斷的重繪產(chǎn)生波浪的形狀

同樣的某些下拉刷新的效果也是通過(guò)這樣的方法去產(chǎn)生的比如

圖10 貝塞爾二階曲線實(shí)現(xiàn)的下拉效果

另外QQ“一鍵下班”功能其實(shí)也是基于二階貝塞爾曲線實(shí)現(xiàn)的

圖11 QQ一鍵下班功能

三階貝塞爾曲線

三階貝賽爾曲線則是擁有兩個(gè)控制點(diǎn),通過(guò)控制點(diǎn)來(lái)控制曲線的走向

圖12 三階貝塞爾曲線公式

對(duì)應(yīng)的三階曲線圖如下

圖13 三階貝塞爾曲線圖

在Android Path中存在對(duì)應(yīng)的方法來(lái)實(shí)現(xiàn)二階貝塞爾曲線

  cubicTo(float x1, float y1, float x2, float y2, float x3, float y3)

其中x1,y1為第一個(gè)控制點(diǎn)抹剩,x2,y2為第二個(gè)控制點(diǎn)撑帖,x3,y3為終點(diǎn)

利用好三階貝塞爾曲線其實(shí)可以有更多的效果了,在很多的App其實(shí)都有運(yùn)用到了

比如百度貼吧的下拉刷新吧兔,美圖的下拉刷新磷仰,Chrome的下拉刷新,慕課網(wǎng)的下拉刷新境蔼,其實(shí)都是基于三階貝塞爾曲線來(lái)實(shí)現(xiàn)的

簡(jiǎn)單說(shuō)下三階貝塞爾運(yùn)用的

第一種,和上述的二階貝塞爾曲線一樣伺通,作為波浪使用

<p>
代表例子:慕課App的下拉刷新

圖14 慕課App下拉刷新效果

這種實(shí)現(xiàn)其實(shí)與二階波浪實(shí)現(xiàn)是一致的箍土,控制好兩個(gè)控制點(diǎn)即可以實(shí)現(xiàn),不做代碼的贅述

第二種則是通過(guò)閉合的路徑產(chǎn)生特殊的效果

<p>
比如說(shuō)下面這個(gè)例子

圖15 閉合路徑產(chǎn)生的效果

這個(gè)效果怎么實(shí)現(xiàn)的呢罐监?
<p>
后面給出相關(guān)實(shí)現(xiàn)的代碼

(8)PathMeasure

<p>
PathMeasure其實(shí)是測(cè)量Path的一個(gè)類吴藻,通過(guò)PathMeasure可以實(shí)現(xiàn)一些比較復(fù)雜的路徑運(yùn)動(dòng)效果

 mPathMeasure = new PathMeasure(mPath, true);  
//設(shè)置運(yùn)動(dòng)的路徑點(diǎn)
 mCurrentPosition = new float[2];  
  ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());   
  valueAnimator.setDuration(duration);  
  valueAnimator.addUpdateListener(new AnimatorUpdateListener() {  
  
       @Override  
       public void onAnimationUpdate(ValueAnimator animation) {  
       float value = (Float) animation.getAnimatedValue();  
       // 獲取當(dāng)前點(diǎn)坐標(biāo)封裝到mCurrentPosition  
       mPathMeasure.getPosTan(value, mCurrentPosition, null);  
       postInvalidate();  
    }  
  });  
  valueAnimator.start();    

通過(guò)PathMeasure可以實(shí)現(xiàn)如下的效果

圖16 Path路徑運(yùn)動(dòng)效果
圖17 Path路徑運(yùn)動(dòng)效果

到此Path中的大部分方法與使用應(yīng)用都已經(jīng)描述到了,由于是本人學(xué)習(xí)筆記弓柱,所以大部分的效果圖都是來(lái)自于網(wǎng)絡(luò)的分享沟堡,感謝各位大牛的分享

Reference

1.自定義控件其實(shí)很簡(jiǎn)單5/12From AigeStudio

2.Android 用Canvas 畫幾何圖形侧但,畫出小黃人From 山言兩語(yǔ)

3.Android雷達(dá)圖(蜘蛛網(wǎng)圖)繪制 From crazy__chen

4.慕課網(wǎng)app下拉刷新圖標(biāo)填充效果的實(shí)現(xiàn)From 安卓弟

5.【Android開源項(xiàng)目解析】QQ“一鍵下班”功能實(shí)現(xiàn)解析From 裸奔的凱子哥

6.四步實(shí)現(xiàn)ChromeLikeSwipeLayout效果From 我是Asha

7.三次貝塞爾曲線練習(xí)之彈性的圓From shadev

8.Path特效之PathMeasure打造萬(wàn)能路徑動(dòng)效From 學(xué)問(wèn)積年而成

9.【Android開源項(xiàng)目解析】仿支付寶付款成功及"天女散花"效果實(shí)現(xiàn)From 裸奔的凱子哥

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市航罗,隨后出現(xiàn)的幾起案子禀横,更是在濱河造成了極大的恐慌,老刑警劉巖粥血,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柏锄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡复亏,警方通過(guò)查閱死者的電腦和手機(jī)趾娃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缔御,“玉大人抬闷,你說(shuō)我怎么就攤上這事「唬” “怎么了笤成?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)有勾。 經(jīng)常有香客問(wèn)我疹启,道長(zhǎng),這世上最難降的妖魔是什么蔼卡? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任喊崖,我火速辦了婚禮,結(jié)果婚禮上雇逞,老公的妹妹穿的比我還像新娘荤懂。我一直安慰自己,他們只是感情好塘砸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布节仿。 她就那樣靜靜地躺著,像睡著了一般掉蔬。 火紅的嫁衣襯著肌膚如雪廊宪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天女轿,我揣著相機(jī)與錄音箭启,去河邊找鬼。 笑死蛉迹,一個(gè)胖子當(dāng)著我的面吹牛傅寡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼荐操,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芜抒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起托启,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宅倒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后驾中,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唉堪,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年肩民,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唠亚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡持痰,死狀恐怖灶搜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情工窍,我是刑警寧澤割卖,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站患雏,受9級(jí)特大地震影響鹏溯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淹仑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一丙挽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匀借,春花似錦颜阐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至是鬼,卻和暖如春肤舞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背均蜜。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工萨赁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兆龙。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親紫皇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慰安,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件聪铺、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,093評(píng)論 4 62
  • 夜深了化焕,星月疲憊地駐守在夜空中,寂靜如水铃剔。在寂靜之下撒桨,凡尼爾山腳下的小鎮(zhèn)里卻是燈火通明,幾乎全鎮(zhèn)的人都涌向了鎮(zhèn)中央...
    陳榟宸閱讀 604評(píng)論 8 5
  • 赫爾曼·黑塞键兜,德國(guó)1877年的70后的老先生凤类,諾貝爾文學(xué)獎(jiǎng)得主。鐵打的諾貝爾普气,流水的得主谜疤。每一個(gè)都是讓平凡的我們膜...
    小天黑閱讀 198評(píng)論 0 2
  • 最近看了許多雞湯,心情類文章现诀,看的時(shí)候很驚訝夷磕,并不是因?yàn)榈览矶啵怯X得他們對(duì)生活的感悟和他們對(duì)生活看的那么透徹仔沿。...
    邂逅君閱讀 436評(píng)論 0 1