iOS 圓形水波浪效果實現(xiàn)

水波浪效果如下

waterWave.gif

最近項目中用到一個小的波浪動畫晕粪,查閱了一些資料如下:
網(wǎng)上參考的一些效果
CDNS上的原理

主要實現(xiàn)方法

  • 水波動畫的關(guān)鍵點就是正余弦函數(shù)
  • 這個效果主要的思路是添加兩條曲線 一條正弦曲線、一條余弦曲線 然后在曲線下添加深淺不同的背景顏色亚情,從而達到波浪顯示的效果

正弦型函數(shù)解析式:y=Asin(ωx+φ)+h
各常數(shù)值對函數(shù)圖像的影響:
φ(初相位):決定波形與X軸位置關(guān)系或橫向移動距離(左加右減)
ω:決定周期(最小正周期T=2π/|ω|)
A:決定峰值(即縱向拉伸壓縮的倍數(shù))
h:表示波形在Y軸的位置關(guān)系或縱向移動距離(上加下減)

正弦.png

我們想要繪制一條函數(shù)摊腋,這個曲線其實都是柵格的像素點組成沸版。可以沿著假想的曲線繪制許多個點兴蒸,然后把點逐一用直線連在一起视粮,如果點足夠多,就可以得到一條滿足需求的曲線橙凳,這也是一種微分的思想蕾殴。而這些點的位置可以通過正弦函數(shù)的解析式求得。
如果要繪制上面這個曲線痕惋,可以觀察:波的峰值是1,周期是2π娃殖,初相位是0值戳,h位移也是0。那么計算各個點的坐標公式就是y = sin(x);獲得各個點的坐標之后炉爆,使用CGPathAddLineToPoint這個函數(shù)堕虹,把這些點逐一連成線卧晓,就可以得到最后的路徑。

另外一條波浪使用余弦函數(shù)赴捞,同樣的原理逼裆,使得2條波浪錯開顯示。

//繪制的部分代碼
    CGFloat waterWaveWidth = self.bounds.size.width;
    //初始化運動路徑
    CGMutablePathRef path = CGPathCreateMutable();
    
    CGMutablePathRef maskPath = CGPathCreateMutable();
    //設(shè)置起始位置
    CGPathMoveToPoint(path, nil, 0, _waveY);
    //設(shè)置起始位置
    CGPathMoveToPoint(maskPath, nil, 0, _waveY);
    //初始化波浪其實Y為偏距
    CGFloat y = _waveY;
    //正弦曲線公式為: y=Asin(ωx+φ)+k;
    for (float x = 0.0f; x <= waterWaveWidth ; x++) {
        y = _waveAmplitude * sin(_wavePalstance * x + _waveX) + _waveY;
        
        CGPathAddLineToPoint(path, nil, x, y);
        
    }

現(xiàn)在 我們有了一條靜態(tài)的線赦政,那怎么讓他動起來呢胜宇?

平移后的圖像

我們可以讓他向左或者向右平移 每隔一段時間平移一次 使用CADisplayLink 使得平移看起來更加的流暢;

//以屏幕刷新速度為周期刷新曲線的位置
    _disPlayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(waveAnimation:)];
    [_disPlayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];

然后在利用CAShapeLayer繪制該波浪恢着。

至此動畫的基本原理就搞清楚了桐愉,具體的代碼實現(xiàn)在demo地址 :)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掰派,隨后出現(xiàn)的幾起案子从诲,更是在濱河造成了極大的恐慌,老刑警劉巖靡羡,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件系洛,死亡現(xiàn)場離奇詭異,居然都是意外死亡略步,警方通過查閱死者的電腦和手機描扯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纳像,“玉大人荆烈,你說我怎么就攤上這事【怪海” “怎么了憔购?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岔帽。 經(jīng)常有香客問我玫鸟,道長,這世上最難降的妖魔是什么犀勒? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任屎飘,我火速辦了婚禮,結(jié)果婚禮上贾费,老公的妹妹穿的比我還像新娘钦购。我一直安慰自己,他們只是感情好褂萧,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布押桃。 她就那樣靜靜地躺著,像睡著了一般导犹。 火紅的嫁衣襯著肌膚如雪唱凯。 梳的紋絲不亂的頭發(fā)上羡忘,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音磕昼,去河邊找鬼卷雕。 笑死,一個胖子當著我的面吹牛票从,可吹牛的內(nèi)容都是我干的漫雕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼纫骑,長吁一口氣:“原來是場噩夢啊……” “哼蝎亚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起先馆,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤发框,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后煤墙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梅惯,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年仿野,在試婚紗的時候發(fā)現(xiàn)自己被綠了铣减。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脚作,死狀恐怖葫哗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情球涛,我是刑警寧澤劣针,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站亿扁,受9級特大地震影響捺典,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜从祝,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一襟己、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牍陌,春花似錦擎浴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春萌狂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怀泊。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工茫藏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霹琼。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓务傲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枣申。 傳聞我的和親對象是個殘疾皇子售葡,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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