iOS動畫之水波動畫

  • 前言:現(xiàn)在很多app為了提供好的交互效果給用戶,通常都會通過添加動畫效果來達到目的头岔。一個好的動畫效果往往會起到神來之筆的作用三痰。而在IOS中動畫效果也是豐富多彩的,我準備在后續(xù)的筆記中詳細的記錄那些動畫。
  • 今天我們就來實現(xiàn)一下在IOS中的水波動畫论泛。先上效果圖:
  • 最開始看到這個效果確實有點難的职恳,不過如果對正弦公式比較了解的話實現(xiàn)起來也挺簡單的所禀。

    • 高中知識:y = Asin(wx + θ) + k;

    • 其中A:代表振幅; w:角頻率,和周期的關(guān)系是:T = 2π/|w| ;θ:初相,相對于標準的正弦公式y(tǒng) = sin(x)而言,θ代表

    • 標準的正弦公式y(tǒng) = sin(x)在水平(x軸)方向上的整體移動放钦,即左加右減;k:偏距,代表標準的正弦公式y(tǒng) = sin(x)在 垂直(y軸)方向上的整體移動,即上加下減北秽。

    • 由表達式 y = sin(x)我們知道:在[0,2π]的區(qū)間上繪制一個完整的正弦波形,周期剛好是2π(T= 2π/|w|) 這里w = 1;繪制2個完整的正弦波形,周期為π。所以可以把w理解成完整波形的個數(shù)最筒。由此可以得出:在區(qū)間[0,waveWidth]上繪制n個完整的波形,w = 2π * n / waveWidth贺氓。另外還要注意一點就是UIKit框架坐標軸是向下的。

    • 上面的知識也只是對正弦公式進行回顧床蜘。怎么樣才能得到波形效果呢辙培?關(guān)鍵點就在初相θ身上。

    • 下面這張圖是正弦公式:y = sin(x)的圖譜:


      我們把初相θ向左移動1個單位長度得到公式:y = sin(x + 1)的圖譜:


      比較這兩張圖譜邢锯,我們可以從中發(fā)現(xiàn):要想實現(xiàn)波形震蕩效果扬蕊,我們只需不斷變化初相θ的值,然后不斷刷新屏幕即可丹擎。

    • CADisplayLink:這個定時器的刷新頻率是60HZ尾抑,即每秒可以對屏幕進行60次刷新,我們?nèi)庋凼歉杏X不出刷新間隔的時差的。
      整個實現(xiàn)過程的代碼如下:

@interface JGWaterWaveAnimation()
{
    //振幅--這個決定波形的起伏高度
    CGFloat _waterAmplitude;
    //頻率--這個決定波形的寬度
    CGFloat _waterFrequency;
    //初相:這個決定了波形水平移動的速度
    CGFloat _waterEpoch;
    //偏距--調(diào)節(jié)距離頂部的高度
    CGFloat _waterSetover;
    //定時器
    CADisplayLink *_timer;
    
    //波形整個的寬度
    CGFloat _waterWaveWidth;
    //波形的整個高度
    CGFloat _waterWaveHeight;
}
/**layer*/
@property(strong,nonatomic)CAShapeLayer *waterShapeLayer;
@end
@implementation JGWaterWaveAnimation
- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        
        //default
        _waterAmplitude = 15.0;
        //假設(shè)在frame的長度上出現(xiàn)3個完整的波形:注意這里乘以0.5出現(xiàn)震蕩效果,如果不乘以0.5只會出現(xiàn)波形平移的效果。
        _waterFrequency = 2 *M_PI * 3 / frame.size.width *0.5;
        _waterEpoch = 0.0;
        _waterSetover = 20.0;
        
        _waterWaveWidth = CGRectGetWidth(self.frame);
        _waterWaveHeight = CGRectGetHeight(self.frame);
        
        [self.layer addSublayer:self.waterShapeLayer];
        //初始化定時器
        _timer = [CADisplayLink displayLinkWithTarget:[YYWeakProxy proxyWithTarget:self] selector:@selector(waterWaveAnimation)];
        [_timer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
    }
    return self;
}
- (void)waterWaveAnimation{
    
    //核心代碼:
    _waterEpoch += 0.08;
    //path
    UIBezierPath *waterWavePath = [UIBezierPath bezierPath];
    [waterWavePath moveToPoint:CGPointMake(0, 0)];
    for (CGFloat x = 0; x < _waterWaveWidth; x ++) {
        CGFloat y = _waterAmplitude * sinf(_waterFrequency * x + _waterEpoch) + _waterSetover;
        [waterWavePath addLineToPoint:CGPointMake(x, y)];
    }
    [waterWavePath addLineToPoint:CGPointMake(_waterWaveWidth, _waterWaveHeight)];
    [waterWavePath addLineToPoint:CGPointMake(0, _waterWaveHeight)];
    [waterWavePath closePath];
    
    self.waterShapeLayer.path = waterWavePath.CGPath;
}
- (CAShapeLayer *)waterShapeLayer{
    if (!_waterShapeLayer) {
        _waterShapeLayer = [CAShapeLayer layer];
        _waterShapeLayer.frame = self.bounds;
        _waterShapeLayer.fillColor = [UIColor colorWithRed:52/255.0 green:152/255.0 blue:219/255.0 alpha:1.0].CGColor;
        _waterShapeLayer.strokeColor = [UIColor clearColor].CGColor;
    }
    return _waterShapeLayer;
}
- (void)dealloc{
    
    [_timer invalidate];
    _timer = nil;
}
@end

原文:https://blog.csdn.net/h2282802627/article/details/79116601

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末接箫,一起剝皮案震驚了整個濱河市演痒,隨后出現(xiàn)的幾起案子拴疤,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抗悍,居然都是意外死亡驹饺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門缴渊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赏壹,“玉大人,你說我怎么就攤上這事衔沼】ㄈ澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵俐巴,是天一觀的道長。 經(jīng)常有香客問我硬爆,道長欣舵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任缀磕,我火速辦了婚禮缘圈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袜蚕。我一直安慰自己糟把,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布牲剃。 她就那樣靜靜地躺著遣疯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凿傅。 梳的紋絲不亂的頭發(fā)上缠犀,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音聪舒,去河邊找鬼辨液。 笑死,一個胖子當著我的面吹牛箱残,可吹牛的內(nèi)容都是我干的滔迈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼被辑,長吁一口氣:“原來是場噩夢啊……” “哼燎悍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盼理,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤间涵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后榜揖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勾哩,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡抗蠢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了思劳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迅矛。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖潜叛,靈堂內(nèi)的尸體忽然破棺而出秽褒,到底是詐尸還是另有隱情,我是刑警寧澤威兜,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布销斟,位于F島的核電站,受9級特大地震影響椒舵,放射性物質(zhì)發(fā)生泄漏蚂踊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一笔宿、第九天 我趴在偏房一處隱蔽的房頂上張望犁钟。 院中可真熱鬧,春花似錦泼橘、人聲如沸涝动。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醋粟。三九已至,卻和暖如春重归,著一層夾襖步出監(jiān)牢的瞬間昔穴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工提前, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吗货,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓狈网,卻偏偏與公主長得像宙搬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拓哺,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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