swift 使用幀動畫(CAKeyframeAnimation)實現(xiàn)Lottie播放小動畫效果

廢話不說先上圖

QQ20210425-101606-HD.gif

有人開始說了 ,你這等于脫褲子放屁,那我引入大佬的一句話,存在即為合理,下面是GitHub Lottie提出的issues

4DA653747AE599E5EFFAAF2F00120FFB.jpg

CPU占用過高,這不能忍啊,我是這個小動畫是一個按鈕上的,當直播狀態(tài)為直播中時間展示,就僅僅一個這么小的動畫 CPU占用在30%左右,官方作者也提出了對應的性能問題

A9A8DBCCA1B856E99485774B2B04F21C.jpg

英語不好的我,直接翻譯

E9A5CC87-AE8C-4824-A8D0-6AF8BDCEF5B6.png

大致的意思就是swift的鍋,這種高深問題,不是我能搞定的,于是想著用原生寫,看著也挺簡單,實現(xiàn)起來也是有點波折的,我還惡補了layer有關的東西

廢話不說上代碼

import UIKit

class SDPlayAnimationView: UIView {
    /// 是否添加了動畫
   private var isPlayAnimation:Bool   {
        get{
           let animation = lineOneLayer.animation(forKey: "animation1")
            guard let _ = animation  else {
                return false
            }
            return true
        }
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        layoutSubUI()
    }
    
    deinit {
        stopAnimation()
    }
    
    private func layoutSubUI() {
        
        let animationWidth = self.bounds.size.width
        
        let animationHeight = self.bounds.size.height
        
        let itemWidth = animationWidth / 3 * 0.45
        
        lineOneLayer.frame = CGRect(x: 0, y: animationHeight - 10, width: itemWidth, height: 10)
        
        lineTwoLayer.frame = CGRect(x: animationWidth / 2 -  itemWidth / 2, y: self.frame.size.height - 20, width: itemWidth, height: 20)
        
        lineThreeLayer.frame = CGRect(x: animationWidth -  itemWidth , y: self.frame.size.height - 15 , width: itemWidth, height: 15)
        self.layer.sublayers?.forEach({ (item) in
            item.cornerRadius = itemWidth * 0.5
        })
    }
    
    private lazy var lineOneLayer:CALayer = setupAnimationLayer()
    
    private lazy var lineTwoLayer:CALayer = setupAnimationLayer()
    
    private lazy var lineThreeLayer:CALayer = setupAnimationLayer()
}
 

extension SDPlayAnimationView: CAAnimationDelegate{
    
    
    /// 快速創(chuàng)建SDPlayAnimationView
    /// - Returns: SDPlayAnimationView
    public class func playAnimationView() -> SDPlayAnimationView {
        return SDPlayAnimationView()
    }
    
    
    /// 停止動畫
    public  func stopAnimation() {
        self.layer.sublayers?.forEach({ (item) in
            item.removeAllAnimations()
        })
    }
    
    
    /// 開始動畫
    public func startAnimation() {
        if isPlayAnimation {
            return
        }
        self.layoutIfNeeded()
        let height = self.bounds.size.height
        setupKeyframeAnimation(layer: lineOneLayer, values: [height * 0.2,height * 0.6,height,height * 0.6,height * 0.2],key: "animation1")
        setupKeyframeAnimation(layer: lineTwoLayer, values: [height * 0.6,height,height * 0.6,height * 0.2,height * 0.6],key: "animation2")
        self.setupKeyframeAnimation(layer: self.lineThreeLayer, values: [height,height * 0.6,height * 0.2,height * 0.6,height],key: "animation3")
    }
    

    private func setupAnimationLayer() -> CALayer {
        let layer = CALayer()
        layer.backgroundColor = UIColor.white.cgColor
        layer.anchorPoint = CGPoint(x: 0, y: 1)
        self.layer.addSublayer(layer)
        return layer
    }
    
     
    private func setupKeyframeAnimation(layer:CALayer,values:[Any] ,key:String)  {
        let animation = CAKeyframeAnimation(keyPath:"bounds.size.height")
        animation.values = values
        animation.duration = 1
        animation.repeatCount = MAXFLOAT
        animation.isRemovedOnCompletion = false
        layer.add(animation, forKey: key)
       
    }
}

再看下CPU,微絲不動,美滋滋

69105AE878C6309D9783D86A69DCBE4F.jpg

最后上傳下代碼地址,可以做對比

https://github.com/lanyuzx/CustomPlayAnimation/tree/master
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钠四,一起剝皮案震驚了整個濱河市俗壹,隨后出現(xiàn)的幾起案子涩拙,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颈嚼,居然都是意外死亡,警方通過查閱死者的電腦和手機饭寺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門阻课,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人艰匙,你說我怎么就攤上這事限煞。” “怎么了员凝?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵署驻,是天一觀的道長。 經(jīng)常有香客問我健霹,道長旺上,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任糖埋,我火速辦了婚禮宣吱,結果婚禮上,老公的妹妹穿的比我還像新娘瞳别。我一直安慰自己征候,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布祟敛。 她就那樣靜靜地躺著疤坝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馆铁。 梳的紋絲不亂的頭發(fā)上跑揉,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音埠巨,去河邊找鬼畔裕。 笑死衣撬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的扮饶。 我是一名探鬼主播具练,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼甜无!你這毒婦竟也來了扛点?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤岂丘,失蹤者是張志新(化名)和其女友劉穎陵究,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奥帘,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡铜邮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寨蹋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片松蒜。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖已旧,靈堂內(nèi)的尸體忽然破棺而出秸苗,到底是詐尸還是另有隱情,我是刑警寧澤运褪,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布惊楼,位于F島的核電站,受9級特大地震影響秸讹,放射性物質(zhì)發(fā)生泄漏檀咙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一璃诀、第九天 我趴在偏房一處隱蔽的房頂上張望攀芯。 院中可真熱鬧,春花似錦文虏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趴久,卻和暖如春丸相,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彼棍。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工灭忠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膳算,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓弛作,卻偏偏與公主長得像涕蜂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子映琳,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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