iOS 抖音點(diǎn)贊動(dòng)畫(huà) 收藏動(dòng)畫(huà)

JWGiveLikeAnimation

描述:iOS 抖音點(diǎn)贊動(dòng)畫(huà) 收藏動(dòng)畫(huà)
git傳送門(mén)

點(diǎn)贊動(dòng)畫(huà)

前言

最近項(xiàng)目中需要模仿抖音的點(diǎn)贊動(dòng)畫(huà)來(lái)應(yīng)用到項(xiàng)目中,所以自己擼了一個(gè)動(dòng)畫(huà)礼预,給同行們分享下,不喜勿噴虏劲。歡迎隨時(shí)批評(píng)指正 QQ:38251725

實(shí)現(xiàn)思路

  • 點(diǎn)贊動(dòng)畫(huà)

    將點(diǎn)贊動(dòng)畫(huà)分解為4個(gè)部分

    1. 6個(gè)倒三角形從中心向外擴(kuò)散托酸,先縮放在放大
    2. 6個(gè)三角全部展開(kāi)之后由內(nèi)向外消失
    3. 心形點(diǎn)贊圖片 從小擴(kuò)大在收縮動(dòng)畫(huà)
    4. 波紋慢慢擴(kuò)大至心型圖片圓周,再慢慢消失

    實(shí)現(xiàn)原理:

    動(dòng)畫(huà)1柒巫、2:使用CAShapeLayer圖層励堡,UIBezierPath曲線繪制三角形。然后使用CAAnimationGroup來(lái)實(shí)現(xiàn)縮放和消失組合動(dòng)畫(huà)堡掏。

    - (void)createTrigonsAnimtion {
        //三角形大小
        for (int i = 0; i < 6; i++) {
            //繪制三角形的圖層
            CAShapeLayer * shapeLayer = [[CAShapeLayer alloc]init];
            shapeLayer.position = _giveLikeView.center;
            shapeLayer.fillColor = self.shapeFillColor.CGColor;
            //三角形
            UIBezierPath * startPath = [UIBezierPath bezierPath];
            [startPath moveToPoint:CGPointMake(-2, _length)];
            [startPath addLineToPoint:CGPointMake(2, _length)];
            [startPath addLineToPoint:CGPointMake(0, 0)];
            shapeLayer.path = startPath.CGPath;
            //旋轉(zhuǎn)圖層应结,形成圓形
            //因?yàn)橐还彩?個(gè),均等應(yīng)該是反轉(zhuǎn)60度 所以是M_PI/3 ,圍繞Z軸旋轉(zhuǎn)
            shapeLayer.transform = CATransform3DMakeRotation(M_PI / 3 * i, 0, 0, 1);
            [self.layer addSublayer:shapeLayer];
            
            //使用動(dòng)畫(huà)組來(lái)解決三角形 出現(xiàn)跟消失】
            CAAnimationGroup * groupAnimation = [CAAnimationGroup animation];
            groupAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
            groupAnimation.duration = self.animationDurtion;
            groupAnimation.fillMode = kCAFillModeForwards;
            groupAnimation.removedOnCompletion = NO;
            
            CABasicAnimation * scaleAnimtion = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
            //縮放時(shí)間占20%
            scaleAnimtion.duration = self.animationDurtion * 0.2;
            scaleAnimtion.fromValue = @(0);
            scaleAnimtion.toValue = @(1);
            
            //繪制三角形結(jié)束  一條直線
            UIBezierPath * endPath = [UIBezierPath bezierPath];
            [endPath moveToPoint:CGPointMake(-2, _length)];
            [endPath addLineToPoint:CGPointMake(2, _length)];
            [endPath addLineToPoint:CGPointMake(0, _length)];
            
            CABasicAnimation * pathAnimtion = [CABasicAnimation animationWithKeyPath:@"path"];
            pathAnimtion.beginTime = self.animationDurtion * 0.2;
            pathAnimtion.duration = self.animationDurtion * 0.8;
            pathAnimtion.fromValue = (__bridge id)startPath.CGPath;
            pathAnimtion.toValue = (__bridge id)endPath.CGPath;
            
            groupAnimation.animations = @[scaleAnimtion,pathAnimtion];
            [shapeLayer addAnimation:groupAnimation forKey:nil];
        }
    }
    

    動(dòng)畫(huà)3: 心形圖片放大縮小泉唁,使用UIView的幀動(dòng)畫(huà)鹅龄,來(lái)設(shè)置每幀的動(dòng)畫(huà)。分2部分亭畜,一部分是放大一部分是恢復(fù)

    [UIView animateKeyframesWithDuration:self.animationDurtion delay:0.0 options:UIViewKeyframeAnimationOptionLayoutSubviews animations:^{
                 /*參數(shù)1:關(guān)鍵幀開(kāi)始時(shí)間
                  參數(shù)2:關(guān)鍵幀占用時(shí)間比例
                  參數(shù)3:到達(dá)該關(guān)鍵幀時(shí)的屬性值 */
                [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 * self.animationDurtion animations:^{
                    self.giveLikeView.transform =  CGAffineTransformMakeScale(1.5, 1.5);;
                }];
                [UIView addKeyframeWithRelativeStartTime:0.5 * self.animationDurtion relativeDuration:0.5 * self.animationDurtion animations:^{
                    self.giveLikeView.transform = CGAffineTransformIdentity;
                }];
            } completion:^(BOOL finished) {
                self.userInteractionEnabled = YES;
            }];
    

    動(dòng)畫(huà)4:波紋動(dòng)畫(huà)使用CAShapeLayer繪制一個(gè)圓圈扮休,CAAnimationGroup組合使用 縮小、寬度變寬拴鸵,再消失玷坠。

    - (void)createCircleAnimation {
        //創(chuàng)建背景圓環(huán)
        CAShapeLayer *circleLayer = [[CAShapeLayer alloc]init];
        circleLayer.frame = self.bounds;
        //清空填充色
        circleLayer.fillColor = [UIColor clearColor].CGColor;
        //設(shè)置畫(huà)筆顏色 即圓環(huán)背景色
        circleLayer.strokeColor =  self.shapeFillColor.CGColor;
        circleLayer.lineWidth = 1;
        //設(shè)置畫(huà)筆路徑
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.frame.size.width/2.0, self.frame.size.height/2.0) radius:_length startAngle:- M_PI_2 endAngle:-M_PI_2 + M_PI * 2 clockwise:YES];
        //path 決定layer將被渲染成何種形狀
        circleLayer.path = path.CGPath;
        [self.layer addSublayer:circleLayer];
        
        //使用動(dòng)畫(huà)組來(lái)解決圓圈從小到大 -->消失
        CAAnimationGroup * groupAnimation = [CAAnimationGroup animation];
        groupAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
        NSTimeInterval groupDurtion = self.animationDurtion * 0.8;
        groupAnimation.duration = groupDurtion;
        groupAnimation.fillMode = kCAFillModeForwards;
        groupAnimation.removedOnCompletion = NO;
    
        CABasicAnimation * scaleAnimtion = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
        //放大時(shí)間占80%
        scaleAnimtion.duration = groupDurtion * 0.8;
        scaleAnimtion.fromValue = @(0);
        scaleAnimtion.toValue = @(1);
    
    
        CABasicAnimation * widthStartAnimtion = [CABasicAnimation animationWithKeyPath:@"lineWidth"];
        widthStartAnimtion.beginTime = 0;
        widthStartAnimtion.duration = groupDurtion * 0.8;
        widthStartAnimtion.fromValue = @(1);
        widthStartAnimtion.toValue = @(3);
    
        CABasicAnimation * widthEndAnimtion = [CABasicAnimation animationWithKeyPath:@"lineWidth"];
        widthEndAnimtion.beginTime =  groupDurtion * 0.8;
        widthEndAnimtion.duration = groupDurtion * 0.2;
        widthEndAnimtion.fromValue = @(3);
        widthEndAnimtion.toValue = @(0);
    
        groupAnimation.animations = @[scaleAnimtion,widthStartAnimtion,widthEndAnimtion];
        [circleLayer addAnimation:groupAnimation forKey:@"circleLayerAnimtion"];
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(groupDurtion * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [circleLayer removeAnimationForKey:@"circleLayerAnimtion"];
            [circleLayer removeFromSuperlayer];
        });
        
    }
    
  • 取消點(diǎn)贊動(dòng)畫(huà)

    取消點(diǎn)贊動(dòng)畫(huà)分解,點(diǎn)贊圖片由外向內(nèi)慢慢消失。

    [self bringSubviewToFront:_giveLikeView];
            _giveLikeView.transform = CGAffineTransformMakeScale(1.1, 1.1);
            [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
                self.giveLikeView.transform = CGAffineTransformMakeScale(0.1, 0.1);
            } completion:^(BOOL finished) {
                self.giveLikeView.hidden = YES;
                self.giveLikeView.transform = CGAffineTransformMakeScale(1, 1);
                self.userInteractionEnabled = YES;
            }];
    

總結(jié)

以上就是整個(gè)動(dòng)畫(huà)的分解原理劲藐。主要是使用的Shaperlayer圖層 貝塞爾繪制圖形八堡,使用動(dòng)畫(huà)組還合成動(dòng)畫(huà)的實(shí)現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末聘芜,一起剝皮案震驚了整個(gè)濱河市秕重,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厉膀,老刑警劉巖溶耘,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異服鹅,居然都是意外死亡凳兵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)企软,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庐扫,“玉大人,你說(shuō)我怎么就攤上這事⌒瓮ィ” “怎么了铅辞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)萨醒。 經(jīng)常有香客問(wèn)我斟珊,道長(zhǎng),這世上最難降的妖魔是什么富纸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任囤踩,我火速辦了婚禮,結(jié)果婚禮上晓褪,老公的妹妹穿的比我還像新娘堵漱。我一直安慰自己,他們只是感情好涣仿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布勤庐。 她就那樣靜靜地躺著,像睡著了一般好港。 火紅的嫁衣襯著肌膚如雪埃元。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天媚狰,我揣著相機(jī)與錄音岛杀,去河邊找鬼。 笑死崭孤,一個(gè)胖子當(dāng)著我的面吹牛类嗤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辨宠,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼遗锣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嗤形?” 一聲冷哼從身側(cè)響起精偿,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赋兵,沒(méi)想到半個(gè)月后笔咽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霹期,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年叶组,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片历造。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甩十,死狀恐怖船庇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侣监,我是刑警寧澤鸭轮,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站橄霉,受9級(jí)特大地震影響窃爷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酪劫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一吞鸭、第九天 我趴在偏房一處隱蔽的房頂上張望寺董。 院中可真熱鬧覆糟,春花似錦、人聲如沸遮咖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)御吞。三九已至麦箍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陶珠,已是汗流浹背挟裂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揍诽,地道東北人诀蓉。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像暑脆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沥曹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354