iOS 給按鈕加上形似陽光的動畫

先上效果圖(因為自己作圖麻煩,圖示用的他人的性雄,這位博主也寫了這個效果,用的是 swift)和demo 地址

效果圖

廢話不多說,先拆分動畫:
1.按鈕圖標放大縮谐僭摺:這一步用的是關鍵幀動畫,主要代碼如下

CAKeyframeAnimation * scaleAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
scaleAnimation.duration = 1;
scaleAnimation.values = @[@0.6, @1, @0.8, @1];
[self.foregroundLayer.mask addAnimation:scaleAnimation forKey:@"transform.scale"];

2.從按鈕的中心擴出一個圓環(huán)來:這一步用的是基礎動畫:代碼如下

CABasicAnimation * diffuseAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
diffuseAnimation.duration = 0.5;
CGSize size = self.bounds.size;
UIBezierPath  *fromPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(size.width/ 2, size.height / 2) radius:size.width / 4 startAngle:0 endAngle:M_PI * 2 clockwise:NO];
UIBezierPath  *toPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(size.width/ 2, size.height / 2) radius:size.width / 2 startAngle:0 endAngle:M_PI * 2 clockwise:NO];
diffuseAnimation.fromValue = (__bridge id _Nullable)(fromPath.CGPath);
diffuseAnimation.toValue = (__bridge id _Nullable)(toPath.CGPath); diffuseAnimation.delegate = self;
[self.circleLayer addAnimation:diffuseAnimation forKey:@"path"];

3.擴圓動畫結(jié)束后按鈕周圍的原點效果:這一步相對比較難厂镇,首先要算好各個小圓點的位置纤壁,我用到了正余弦函數(shù),然后根據(jù)圓的半徑算出了相對于圓心的位置捺信,后來給這些小圓點加了縮放酌媒,給他的父級 layer 加了放大,旋轉(zhuǎn)動畫(這可能還有別的思路迄靠,大家可以多多思考)秒咨。

 if (self.backgroundLayer) {
        [self.backgroundLayer removeFromSuperlayer];
    }
    self.backgroundLayer = [CALayer layer];
    self.backgroundLayer.frame = self.bounds;
    for (int i = 0; i < self.shapeAry.count; i ++) {
        
        CAShapeLayer * shape = self.shapeAry[i];
        
        // 計算各個點相對于中心點的角度(相對于 x 軸和 y 軸的角度)
        CGFloat angle = M_PI * 2 / self.shapeAry.count * i;
        // 圓環(huán)半徑
        CGFloat  banjing  = self.bounds.size.width / 2;
        // 各個點相對于中心點的偏移量 根據(jù)正余弦函數(shù)計算
        CGFloat shapeX = banjing * cos(angle);
        CGFloat shapeY = banjing * sin(angle);
        // 設置圓環(huán)的大小
        CGFloat shapeW = i % 2 == 0 ? 10.f : 6.f;
        CGFloat shapeH = i % 2 == 0 ? 10.f : 6.f;
    
        // 設置 frame
        shape.frame = CGRectMake(shapeX + banjing - shapeW / 2, shapeY + banjing - shapeH / 2, shapeW, shapeH);
        // 設置填充色
        shape.fillColor = [UIColor colorWithRed:(arc4random() % 255)/ 255.0 green:(arc4random() % 255)/ 255.0 blue:(arc4random() % 255)/ 255.0 alpha:1].CGColor;
        
        [self.backgroundLayer addSublayer:shape];
        
        // 點變小
        CABasicAnimation * basicAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
        basicAnimation.duration = 0.5;
        basicAnimation.fromValue = (__bridge id _Nullable)[UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, shapeW, shapeH)].CGPath;
        basicAnimation.toValue = (__bridge id _Nullable)[UIBezierPath bezierPathWithOvalInRect:CGRectMake(shapeW / 2, shapeH / 2, 0, 0)].CGPath;
        [shape addAnimation:basicAnimation forKey:@"path"];

        // 旋轉(zhuǎn)
        CABasicAnimation * rote = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        rote.duration = 0.5;
        rote.fromValue = [NSNumber numberWithFloat:0];
        rote.toValue = [NSNumber numberWithFloat:1];
        [self.backgroundLayer addAnimation:rote forKey:@"transform.rotation.z"];
        
        // 放大
        CAKeyframeAnimation * scaleAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
        scaleAnimation.duration = 0.5;
        scaleAnimation.values = @[@0.8, @1.4];
        scaleAnimation.fillMode = kCAFillModeForwards;
        scaleAnimation.removedOnCompletion = NO;
        [self.backgroundLayer addAnimation:scaleAnimation forKey:@"transform.scale"];
    }
    [self.layer addSublayer:self.backgroundLayer];

最后:
1、大家不喜勿噴掌挚,喜歡的可以 star
2雨席、參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吠式,隨后出現(xiàn)的幾起案子陡厘,更是在濱河造成了極大的恐慌抽米,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雏亚,死亡現(xiàn)場離奇詭異缨硝,居然都是意外死亡,警方通過查閱死者的電腦和手機罢低,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門查辩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人网持,你說我怎么就攤上這事宜岛。” “怎么了功舀?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵萍倡,是天一觀的道長。 經(jīng)常有香客問我辟汰,道長列敲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任帖汞,我火速辦了婚禮戴而,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翩蘸。我一直安慰自己所意,他們只是感情好,可當我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布催首。 她就那樣靜靜地躺著扶踊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪郎任。 梳的紋絲不亂的頭發(fā)上秧耗,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天,我揣著相機與錄音舶治,去河邊找鬼绣版。 笑死,一個胖子當著我的面吹牛歼疮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诈唬,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼韩脏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铸磅?” 一聲冷哼從身側(cè)響起赡矢,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤杭朱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吹散,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弧械,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年空民,在試婚紗的時候發(fā)現(xiàn)自己被綠了刃唐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡界轩,死狀恐怖画饥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浊猾,我是刑警寧澤抖甘,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站葫慎,受9級特大地震影響衔彻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偷办,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一艰额、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爽篷,春花似錦悴晰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泪喊,卻和暖如春棕硫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袒啼。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工哈扮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚓再。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓滑肉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摘仅。 傳聞我的和親對象是個殘疾皇子靶庙,可洞房花燭夜當晚...
    茶點故事閱讀 43,435評論 2 348

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