仿照抖音點(diǎn)贊動(dòng)畫、取消點(diǎn)贊動(dòng)畫分析以及封裝

最近在學(xué)習(xí)iOS的動(dòng)畫效果,做的一些小demo記錄自己的學(xué)習(xí)過程,也和大家分享一下自己的做法泣崩,如果有不周到的地方請(qǐng)大神們不吝賜教伊群。

今天給大家分享一下自己做的仿照抖音點(diǎn)贊的一個(gè)小動(dòng)畫。

一.效果展示

主要涉及了三個(gè)過程:煙花散開的過程影兽、紅心順時(shí)針旋轉(zhuǎn)出現(xiàn)揭斧、紅線逆時(shí)針旋轉(zhuǎn)縮小消失。

旋轉(zhuǎn)和縮小是比較簡(jiǎn)單的過程(不能了解的小伙伴可以下載demo自行查看),我們今天主要分析煙花散開的效果峻堰。

效果

二.效果分析

主要包含的技術(shù):

1讹开、CAShapeLayer和UIBezierPath 繪制。

2捐名、CAAnimationGroup組合動(dòng)畫萧吠。

慢動(dòng)畫

仔細(xì)觀察慢動(dòng)畫,發(fā)現(xiàn)主題是一個(gè)三角形,旋轉(zhuǎn)60度繪制6個(gè)。

image

動(dòng)畫的過程大概是:

a.先縮放動(dòng)畫從0到1的過程 執(zhí)行時(shí)間duration * 0.2

b.然后執(zhí)行路徑動(dòng)畫的起始點(diǎn)是原點(diǎn)(0桐筏,0)消失點(diǎn)在三角形的底邊(width,0)開始時(shí)間是duration * 0.2,執(zhí)行時(shí)長(zhǎng)是duration * 0.8.

路徑動(dòng)畫的執(zhí)行過程大概是:

gif

三拇砰、結(jié)合代碼分析

首先封裝了一個(gè)UIView實(shí)現(xiàn)動(dòng)畫效果:YPGiveLikeButton梅忌。YPGiveLikeButton包含兩個(gè)UIImageView實(shí)現(xiàn)圖片顯示和動(dòng)畫效果。具體可以參考demo,這里只介紹核心代碼除破。

1.創(chuàng)建繪制三角形的layer

        CAShapeLayer *layer = [CAShapeLayer layer];
        layer.position = CGPointMake(self.frame.size.width * 0.5,   self.frame.size.height * 0.5);
        layer.fillColor = [UIColor redColor].CGColor;
        layer.strokeColor = [UIColor clearColor].CGColor;
        layer.anchorPoint = CGPointMake(0.5, 0.5);

for循環(huán)創(chuàng)建6個(gè)這樣的小三角

CGFloat length = 4;
    CGFloat width = 30;
    for (int i = 0; i < 6; i++) {
        CAShapeLayer *layer = [CAShapeLayer layer];
        layer.position = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5);
        layer.fillColor = [UIColor redColor].CGColor;
        layer.strokeColor = [UIColor clearColor].CGColor;
        //...代碼塊1
       //...代碼塊2
      //...代碼塊3
     //...代碼塊4
}

創(chuàng)建6個(gè)layer實(shí)例,并利用貝塞爾曲線繪制小三角形牧氮。
...代碼塊1位置加入

        UIBezierPath *startPath = [UIBezierPath bezierPath];
        [startPath moveToPoint:CGPointMake((- length) * 0.5, -width)];
        [startPath addLineToPoint:CGPointMake((length) * 0.5, -width)];
        [startPath addLineToPoint:CGPointMake(0, 0)];
        [startPath addLineToPoint:CGPointMake((- length) * 0.5, -width)];

將貝塞爾曲線作為layer的path,通過旋轉(zhuǎn)將6個(gè)小三角圍繞layer的中心鋪開。
...代碼塊2位置加入

        layer.path = startPath.CGPath;
        layer.transform = CATransform3DMakeRotation(M_PI / 3.0f * i, 0.0, 0.0, 1.0);
        [self.layer addSublayer:layer];

接著創(chuàng)建一個(gè)收縮的動(dòng)畫,開始時(shí)間是CACurrentMediaTime(),動(dòng)畫時(shí)長(zhǎng)是duration * 0.2,設(shè)置動(dòng)畫是長(zhǎng)是1s,那么伸縮動(dòng)畫就是0.2s.
...代碼3位置加入

//伸縮動(dòng)畫
        CABasicAnimation *scralAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
        scralAnimation.fromValue = @(0.0);;
        scralAnimation.toValue = @(1.0);
        scralAnimation.duration = duration * 0.2;

接著創(chuàng)建一個(gè)小三角消失的動(dòng)畫,動(dòng)畫的開始時(shí)間是伸縮動(dòng)畫結(jié)束以后,也就是CACurrentMediaTime() + duration * 0.2,動(dòng)畫是時(shí)長(zhǎng)是duration * 0.8.然后創(chuàng)建一個(gè)動(dòng)畫組瑰枫,將伸縮動(dòng)畫和小三角的消失動(dòng)畫加入動(dòng)畫組中踱葛。
...代碼4位置加入

        CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
        pathAnimation.fromValue = (__bridge id)layer.path;
        pathAnimation.toValue = (__bridge id)endPath.CGPath;
        pathAnimation.beginTime = duration * 0.2;
        pathAnimation.duration = duration * 0.8;
        
        CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];
        groupAnimation.animations = @[pathAnimation,scralAnimation];
        groupAnimation.fillMode = kCAFillModeForwards;
        groupAnimation.duration = duration;
        groupAnimation.removedOnCompletion = NO;//完成后是否移除
        groupAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
        groupAnimation.delegate = self;
        [layer addAnimation:groupAnimation forKey:@"groupAnimation"];

設(shè)置了groupAnimation.delegate = self;在動(dòng)畫結(jié)束的時(shí)候?qū)⒓虞dself.layer上的6個(gè)layer清除掉,避免用戶反復(fù)點(diǎn)贊造成sublayer過多光坝。

到此煙花散開的動(dòng)畫就結(jié)束了尸诽。除此之外,點(diǎn)贊的時(shí)候還可以加上一個(gè)給??旋轉(zhuǎn)的動(dòng)畫:
旋轉(zhuǎn)動(dòng)畫結(jié)束前,禁用選中的點(diǎn)擊事件盯另,防止動(dòng)畫結(jié)束前用戶多次點(diǎn)擊性含。動(dòng)畫結(jié)束以后將點(diǎn)擊事件放開。

    self.selected = YES;
    self.afterImageView.userInteractionEnabled = NO;
    CAKeyframeAnimation *rotateAnima = [CAKeyframeAnimation  animationWithKeyPath:@"transform.rotation.z"];
    rotateAnima.values = @[@0.0, @(M_PI * 0.15), @(0.0)];
    rotateAnima.duration = duration * 0.5;
    rotateAnima.repeatCount = 1;
    rotateAnima.beginTime = CACurrentMediaTime();
    rotateAnima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    rotateAnima.delegate = self;

    [self.afterImageView.layer addAnimation:rotateAnima forKey:@"rotationAnimation"];

注意:取消點(diǎn)贊的動(dòng)畫鸳惯,是用了UIView的動(dòng)畫代碼如下:

    self.beforeImageView.hidden = NO;
    [UIView animateWithDuration:0.35f delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
        self.afterImageView.transform = CGAffineTransformScale(CGAffineTransformMakeRotation(-M_PI_4), 0.1f, 0.1f);
    }completion:^(BOOL finished) {
        self.selected = NO;
        self.afterImageView.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
    }];

四商蕴、總結(jié)
以上是模仿抖音點(diǎn)贊動(dòng)畫、取消點(diǎn)贊動(dòng)畫的核心代碼芝发。如果需要demo可以去demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绪商,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辅鲸,更是在濱河造成了極大的恐慌格郁,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異理张,居然都是意外死亡赫蛇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門雾叭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悟耘,“玉大人,你說我怎么就攤上這事织狐≡萦祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵移迫,是天一觀的道長(zhǎng)旺嬉。 經(jīng)常有香客問我,道長(zhǎng)厨埋,這世上最難降的妖魔是什么邪媳? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮荡陷,結(jié)果婚禮上雨效,老公的妹妹穿的比我還像新娘。我一直安慰自己废赞,他們只是感情好徽龟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唉地,像睡著了一般据悔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耘沼,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天极颓,我揣著相機(jī)與錄音,去河邊找鬼耕拷。 笑死讼昆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骚烧。 我是一名探鬼主播浸赫,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赃绊!你這毒婦竟也來了既峡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤碧查,失蹤者是張志新(化名)和其女友劉穎运敢,沒想到半個(gè)月后校仑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡传惠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年迄沫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卦方。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羊瘩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盼砍,到底是詐尸還是另有隱情尘吗,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布浇坐,位于F島的核電站睬捶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏近刘。R本人自食惡果不足惜擒贸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望觉渴。 院中可真熱鬧酗宋,春花似錦、人聲如沸疆拘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哎迄。三九已至,卻和暖如春隆圆,著一層夾襖步出監(jiān)牢的瞬間漱挚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工渺氧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旨涝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓侣背,卻偏偏與公主長(zhǎng)得像白华,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贩耐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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