iOS-制作波紋動(dòng)畫

在網(wǎng)易新聞和其他的APP中,大家可能都觀察到了在個(gè)人中心里面,有一個(gè)水波紋一樣的動(dòng)畫效果,這個(gè)功能還是非常的有用的,在實(shí)際開(kāi)發(fā)中就可以用上。

看到這個(gè)動(dòng)畫效果,我心里第一個(gè)想到就是正余弦函數(shù),但是公式已經(jīng)忘記了上網(wǎng)查了以后給出詳細(xì)的說(shuō)明:正弦型函數(shù)解析式:y=Asin(ωx+φ)+h

各常數(shù)值對(duì)函數(shù)圖像的影響:

φ(初相位):決定波形與X軸位置關(guān)系或橫向移動(dòng)距離(左加右減)

ω:決定周期(最小正周期T=2π/|ω|)

A:決定峰值(即縱向拉伸壓縮的倍數(shù))

h:表示波形在Y軸的位置關(guān)系或縱向移動(dòng)距離(上加下減)

但公式已經(jīng)有了剩下的該是如何實(shí)現(xiàn)劃線了,我們使用CAShapeLayer和UIBezierPath來(lái)實(shí)現(xiàn)功能,

_shapeLayer = [CAShapeLayer layer];

_shapeLayer.frame = CGRectMake(0, 100, 375, 150);

[self.view.layer addSublayer:_shapeLayer];

_shapeLayer2 = [CAShapeLayer layer];

_shapeLayer2.frame = CGRectMake(0, 100, 375, 150);

[self.view.layer addSublayer:_shapeLayer2];

_shapeLayer.fillColor = [[UIColor orangeColor] colorWithAlphaComponent:0.3].CGColor;

_shapeLayer2.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.3].CGColor;

_displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawPath)];

[_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];

drawPath里面我們就要實(shí)現(xiàn)正余弦函數(shù)參數(shù)的設(shè)定和貝塞爾曲線劃線的過(guò)程。

CGFloat A = 20.f;//A振幅

CGFloat h = 0;//y軸偏移

CGFloat ω = 0.03;//角速度ω變大,則波形在X軸上收縮(波形變緊密);角速度ω變小,則波形在X軸上延展(波形變稀疏)。不等于0

CGFloat φ = 0 - i;//初相,x=0時(shí)的相位;反映在坐標(biāo)系上則為圖像的左右移動(dòng)。

//y=Asin(ωx+φ)+h

_path = [UIBezierPath bezierPath];

_path2 = [UIBezierPath bezierPath];

[_path moveToPoint:CGPointZero];

[_path2 moveToPoint:CGPointZero];

for (int i = 0; i < 376; i ++) {

CGFloat x = i;

CGFloat y = A * sin(ω*x+φ)+h;

CGFloat y2 = A * cos(ω*x+φ)+h;

[_path addLineToPoint:CGPointMake(x, y)];

[_path2 addLineToPoint:CGPointMake(x, y2)];

}

[_path addLineToPoint:CGPointMake(375, -100)];

[_path addLineToPoint:CGPointMake(0, -100)];

_path.lineWidth = 1;

_shapeLayer.path = _path.CGPath;

[_path2 addLineToPoint:CGPointMake(375, -100)];

[_path2 addLineToPoint:CGPointMake(0, -100)];

_path2.lineWidth = 1;

_shapeLayer2.path = _path2.CGPath;

i += 0.1;

if (i > M_PI * 2) {

i = 0;//防止i越界

}

這樣的話一個(gè)雙波紋正余弦動(dòng)畫就完成了,有興趣的朋友可以自己試試,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容