成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大牛推薦:iOS 自定義下拉線條動畫

移動開發 iOS
這是本章的第二個 demo,下面這個案例中,我把線條動畫和數學知識結合在了一起。通過這個案例,可以很好地向你展示如何自己歸納出一個數學公式,并把它用到一個自定義動畫中。

這是本章的第二個 demo,下面這個案例中,我把線條動畫和數學知識結合在了一起。通過這個案例,可以很好地向你展示如何自己歸納出一個數學公式,并把它用到一個自定義動畫中。

首先,我們還是先看最終效果 :


OK,可以看到隨著手指在屏幕上滑動距離的改變,線條一開始逐漸靠攏,到達一定位置后開始彎曲,最終合并成了一個圓。順便一提,我已經把這個動畫封裝到了一個上拉、下拉刷新的控件中,并且用在了大象公會這款獨立開發的 App 中。 你可以提前下載下來一睹實際效果。

下面講講我是怎么思考這個動畫的。首先,最終控制這個動畫進度的是一個 CALayer 內部的自定義的屬性:

 

  1. @property(nonatomic,assign)CGFloat progress; 

無論你是通過手指滑動產生偏移量,還是滑動 UISlider 改變一個數值,最終都將轉化到這個屬性的改變。然后,在這個屬性的 setter 方法里,我們讓 layer 去實時地重繪,就像這樣:

 

  1. -(void)setProgress:(CGFloat)progress{ self.curveLayer.progress = progress; 
  2. [self.curveLayer setNeedsDisplay]; 

至于重繪的算法,屬于細節上要考慮的事了。我們做一個動畫的步驟都是先考慮宏觀,再去考慮細節上的實現。就像開發一個 App 一樣,一開始肯定是先考慮架構,再去往這個框架里添磚加瓦,修修補補。現在,我們對這個動畫的整體思路已經清楚了,下面開始深入到細節去思考具體算法的實現。我把這個動畫分成了兩個階段:0~0.5 和 0.5~1.0。 這是什么意思?

做動畫還是那句話 ——「善于分解」。我們先看前半程,也就是 progress 從一開始的 0 運動到中間狀態 0.5 的這一個階段。這一個階段兩條線段分別從上方和下方兩個方向向中間運動,直到接觸到中線為止。這一階段的畫線算法非常簡單,只要能實時獲得 A,B 兩點的坐標,剩下用 UIBezierPath 的 moveToPoint,addLineToPoint 就完事了。所以,問題轉換成了求 A,B 兩點運動的公式(其實只要求出一點,另一點無非就相差了一個線段長度 h)。請看演示動畫(注:在電子書中是有交互動畫的,但因為現在是以文章的形式呈現,所以我只能通過圖片的方式向你展示)

其實你只要愿意動筆在紙上嘗試推演一番,并不難求得這兩個點的運動公式:

yA = H/2 + h + (1-2progress) (H/2 - h)

yB = H/2 + (1-2progress) (H/2 - h)

接下來是動畫的第二階段 0.5~1.0。這個階段有些許復雜:「B 點保持不動,A 點繼續運動到 B 的位置,同時,在頂部根據當前的進度再畫出圓弧」。視覺上給人的感覺就好像尾巴在逐漸縮短,頭部在慢慢彎曲。同樣的,我只能以圖片的形式向你展示。


在這個過程中,我們不難先求得 A 點的坐標是:

yA = H/2 + h - h(progress - 0.5) 2

比較麻煩的是這個圓弧該怎么畫?答案是可以用 UIBezierPath 中提供的 - (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise NS_AVAILABLE_IOS(4_0); 這個方法繪制出圓弧。具體思路是:以 CGPointMake(self.frame.size.width/2,self.frame.size.height/2) 為圓心,10 為半徑,按順時針方向,從 M_PI(90°) 的起始角度,畫到 2*M_PI 的結束角度。

關于 - (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise; 方法的解釋:如果設置開始角度均為 0 ,結束角度均為 π。那么設置 clockwise(順時針) 為 YES 時,畫出的是下半段圓弧;反之, 設置 clockwise(順時針) 為 NO 時,畫出的是上半段圓弧;

以上,我們只完成了一條線段的整個過程。同理,也能獲得另一條線段的繪制算法。最后,別忘了線段頂端還有個箭頭。繪制箭頭的算法 Gallery 4.1:我們以 B 點作為箭頭的起始起點,斜向左下方 30° 角延長 3 個單位。彎曲之后也同理,只需要額外加上線段轉過的角度即可。


相應的代碼就是:

 

  1. [arrowPath moveToPoint:pointB]; 
  2. [arrowPath addLineToPoint:CGPointMake(pointB.x - 3*(cosf(Degree)), pointB.y + 3*(sinf(Degree)))]; 
  3. [curvePath1 appendPath:arrowPath]; 

OK,這一個 demo 的分析到這里就結束了。完整代碼可以在本書對應的 Github Repo:https://github.com/KittenYang/A-GUIDE-TO-iOS-ANIMATION 中下載。

關于作者:KITTEN-YANG,大四在讀,目前在錘子科技做 iOS 實習。平時癡迷于交互動畫,立志做一名頂尖的軟件工程師兼交互設計師。您可以參觀我的個人網站 http://kittenyang.com 或者來我的微博交個朋友:@KITTEN-YANG 謝謝。

責任編輯:chenqingxiang 來源: iOS開發
相關推薦

2013-06-27 11:10:01

iOS開發自定義UISlider

2013-07-18 16:09:10

自定義iOS狀態欄iOS開發iOS學習

2011-08-09 17:16:56

CoreAnimati動畫

2021-02-21 08:12:24

SVG線條動畫Web動畫

2015-10-14 10:54:20

iOS開發讀書

2021-09-02 10:00:42

鴻蒙HarmonyOS應用

2012-06-01 11:02:33

2017-10-25 14:07:54

APPiOSxcode

2011-08-02 11:17:13

iOS開發 View

2021-01-20 08:58:39

iOS 14桌面圖標快捷指令

2013-05-30 15:53:17

iOS開發iOS SDKPopver

2015-02-12 15:33:43

微信SDK

2017-07-19 14:59:26

Drawable動畫實現

2017-07-18 16:07:23

Drawable動畫Android

2021-12-02 18:05:21

Android Interpolato動畫

2021-02-21 07:49:40

Web動畫SVG線條動畫

2015-01-15 16:45:05

iOS源碼自定義畫圖

2012-12-24 14:42:48

iOS自定義狀態欄

2015-02-12 15:38:26

微信SDK

2016-11-16 21:55:55

源碼分析自定義view androi
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本精品久久久久久久 | 欧美日在线| 天天综合天天 | 成人国产午夜在线观看 | 91污在线| 天天插天天操 | 中文字幕在线视频网站 | 亚洲男人天堂 | a看片 | 精品九九九 | 久久久久黄色 | 亚洲精品1区 | 亚洲精品久久久久久久久久久久久 | 九九在线视频 | 成人国产免费观看 | 99国内精品久久久久久久 | 最新av在线播放 | 日韩一级免费看 | 一区二区三区免费看 | 国产精品高清在线 | 亚洲午夜精品久久久久久app | 91在线精品视频 | 国产精品久久一区 | 国产成人免费视频网站高清观看视频 | 国产精品久久久久久久久久久免费看 | 欧美日韩a | 中文字幕日韩在线观看 | 成人免费在线观看视频 | 国内久久精品 | 一区二区三区四区视频 | 国产高清自拍视频在线观看 | h片免费在线观看 | 久青草影院 | 亚洲欧美中文日韩在线 | 黄色毛片免费视频 | 色久伊人| 亚洲国产精品一区二区久久 | 91久久夜色| 男人天堂网址 | 久久久久久网站 | 久久福利电影 |