iOS 實現(xiàn)閃電動畫效果

看到手機中天氣閃電效果挺炫酷的,就想試著實現(xiàn)其效果,費了一番功夫,實現(xiàn)了大致的效果,還有許多地方需要改進.

使用到的有UIBezierPath,CAShapeLayer,CABasicAnimation,CAAnimationGroup等.

實現(xiàn)的大致思路,就是需要繪制出閃電的路徑,包括主干路徑和分支路徑,最后添加動畫效果.

要想繪制路徑就需要知道路徑的點,在網(wǎng)上搜索到一個方法可以得到閃電的路徑的點.如下:

/**

* ?設(shè)置閃電的主干的點

*/

- (void)setupLightPointArrWithStartPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint displace:(CGFloat)displace

{

CGFloat midX = startPoint.x;

CGFloat midY = startPoint.y;

[pointArr removeAllObjects];

[pointArr addObject:NSStringFromCGPoint(startPoint)];

while (midY < endPoint.y)

{

if (startPoint.x < ?kScreenWidth/2 )

{

midX += (arc4random()%3 - 0.5)*displace;

midY += (arc4random()%5 - 0.5)*displace;

}else

{

midX -= (arc4random()%3 - 0.5)*displace;

midY += (arc4random()%5 - 0.5)*displace;

}

[pointArr addObject:NSStringFromCGPoint(CGPointMake(midX, midY))];

}

}


其中閃電分支的獲取點也是如此.

注意:其中分支的起點是主干上的點.當(dāng)然也可以不是.

需要的點都已經(jīng)獲取到了,就需要繪制了.

/**

* ?設(shè)置閃電的路徑

*/

- (void)setupLightningPath

{

UIBezierPath *path = [UIBezierPath bezierPath];

[bezierPathArr addObject:path];

CGPoint point ;

for (int i = 0; i < pointArr.count; i ++)

{

point = CGPointFromString(pointArr[i]);

if (i == 0)

{

//畫線,設(shè)置起點

[path moveToPoint:point];

}else

{

//設(shè)置第二個條線的終點,會自動把上一個終點當(dāng)做起點

[path addLineToPoint:point];

}

NSLog(@"-----point%@ ",NSStringFromCGPoint(point));

if ([branchLightningStartPointArr containsObject:NSStringFromCGPoint(point)])

{

NSMutableArray *branchPointArr = [self setupBranchLightningPathPointWithStartPoint:CGPointMake(point.x, point.y) endPoint:CGPointMake(point.x + 100, point.y + 100) displace:1];

UIBezierPath *branchPath = [UIBezierPath bezierPath];

CGPoint branchPoint;

for (int j = 0; j < branchPointArr.count; j ++)

{

branchPoint = CGPointFromString(branchPointArr[j]);

if (j == 0)

{

//畫線,設(shè)置起點

[branchPath moveToPoint:branchPoint];

}else

{

//設(shè)置第二個條線的終點,會自動把上一個終點當(dāng)做起點

[branchPath addLineToPoint:branchPoint];

}

}

[bezierPathArr addObject:branchPath];

}

}

}

閃電的路徑繪制完成以后就需要實現(xiàn)其動畫效果.

/**

* ?設(shè)置閃電的動畫效果

*/

- (void)setupLightningAnimation

{

CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];

pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];

pathAnimation.duration = 0.2;

pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f];

pathAnimation.toValue = [NSNumber numberWithFloat:1.0f];

pathAnimation.repeatCount = 1;

//透明度

CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];

opacityAnimation.fromValue = [NSNumber numberWithFloat:1.0];

opacityAnimation.toValue = [NSNumber numberWithFloat:0.0];

CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];

groupAnimation.duration = 1.0;

groupAnimation.animations = @[[self opacityForever_Animation:0.1], pathAnimation,opacityAnimation];

groupAnimation.autoreverses = YES;

groupAnimation.repeatCount = 1;

for (int i = 0; i < bezierPathArr.count; i ++)

{

UIBezierPath *path = bezierPathArr[i];

CAShapeLayer *pathLayer = [CAShapeLayer layer];

pathLayer.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));

pathLayer.path = path.CGPath;

pathLayer.strokeColor = [[UIColor whiteColor] CGColor];

pathLayer.fillColor = nil;

pathLayer.lineWidth = (i == 0?1.0f:0.5);

pathLayer.lineJoin = kCALineJoinMiter;

[self.layer addSublayer:pathLayer];

[pathLayer addAnimation:groupAnimation forKey:@"xxx"];

}

}

至此動畫簡單的閃電效果已經(jīng)完成了.還有許多地方需要繼續(xù)完善.

更新了demo效果如下:


圖片發(fā)自簡書App

上傳到了Github:https://github.com/ITXIN/AnimationShow

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌托慨,老刑警劉巖殉农,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肛炮,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚪腐,警方通過查閱死者的電腦和手機箭昵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來回季,“玉大人家制,你說我怎么就攤上這事∨菀唬” “怎么了颤殴?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鼻忠。 經(jīng)常有香客問我涵但,道長,這世上最難降的妖魔是什么帖蔓? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任矮瘟,我火速辦了婚禮,結(jié)果婚禮上塑娇,老公的妹妹穿的比我還像新娘澈侠。我一直安慰自己,他們只是感情好埋酬,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布哨啃。 她就那樣靜靜地躺著,像睡著了一般写妥。 火紅的嫁衣襯著肌膚如雪拳球。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天耳标,我揣著相機與錄音醇坝,去河邊找鬼邑跪。 笑死次坡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的画畅。 我是一名探鬼主播砸琅,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轴踱!你這毒婦竟也來了症脂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诱篷,沒想到半個月后壶唤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡棕所,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年闸盔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳省。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡迎吵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出针贬,到底是詐尸還是另有隱情击费,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布桦他,位于F島的核電站蔫巩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏快压。R本人自食惡果不足惜批幌,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗓节。 院中可真熱鬧荧缘,春花似錦、人聲如沸拦宣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸵隧。三九已至绸罗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豆瘫,已是汗流浹背珊蟀。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留外驱,地道東北人育灸。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像昵宇,于是被迫代替她去往敵國和親磅崭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

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