iOS炫酷動(dòng)畫(一)

最近赘艳,看到一個(gè)很炫酷的動(dòng)畫酌毡。效果是這樣的。在進(jìn)行切換的時(shí)候蕾管,會(huì)有一個(gè)線跑的動(dòng)畫枷踏。于是乎參照著用swift做了一份。沒(méi)有封裝成tabbar掰曾,只是做了個(gè)動(dòng)畫效果旭蠕。https://github.com/silan-liu/SLAnimation

1.gif
動(dòng)畫拆解

乍一看,點(diǎn)擊另外一個(gè)item后旷坦,紅色的圓圈可以想像成是一個(gè)鐵絲圍成的圈掏熬,圈被逐漸解開,然后有根水平線在拉著圓圈走向目的地秒梅,在到達(dá)目的地的途中旗芬,又開始繞成一個(gè)圈,尾巴逐漸縮短捆蜀,最終成為圓疮丛。(實(shí)在是不知道怎么描述了╮(╯▽╰)╭)

我們注意到,每個(gè)選中的item是有個(gè)紅色圓圈包圍的辆它,圖標(biāo)也是選中狀態(tài)誊薄,切換選中狀態(tài),紅色圈會(huì)消失锰茉,圖標(biāo)變成未選中暇屋。

其實(shí)剛開始看到,這種圓解開洞辣,又繞成圓的走法,想到了strokeStart和strokenEnd昙衅。只是沒(méi)明白扬霜,是怎樣的軌跡可以做成這種效果。

動(dòng)手實(shí)現(xiàn)

1而涉、首先寫個(gè)ItemView著瓶,即每個(gè)單獨(dú)的view。因?yàn)槊總€(gè)item都可以點(diǎn)擊啼县,我們可以直接繼承自UIButton材原。有2個(gè)imageview,選中和未選中狀態(tài)的季眷,在選中時(shí)余蟹,隱藏normalImageView。未選中時(shí)子刮,將其顯示出來(lái)威酒。

class SLAnimationItemView: UIButton {

    let margin: CGFloat = 8.0

    private var innerSelectStatus: Bool = false
    
    private var normalImageView: UIImageView?
    private var selectedImageView: UIImageView?
    
    var outCircleLayer: CAShapeLayer?
    
    // MARK: show/hide
    func showOutLineLayer(show: Bool) {

    }
}

2窑睁、寫動(dòng)畫。其實(shí)它的效果葵孤,在點(diǎn)擊的時(shí)候担钮,circle隱藏,在動(dòng)畫結(jié)束之后尤仍,選中的item將circle顯示出來(lái)箫津。動(dòng)畫軌跡是這樣:0_0,兩個(gè)item分別有個(gè)圈宰啦,中間連著一根線苏遥。

2@2x.png

這種軌跡可以用貝塞爾曲線來(lái)畫,主要代碼如下绑莺。注意的是點(diǎn)擊的item位置問(wèn)題暖眼,如果點(diǎn)擊的是原item左邊的,是順時(shí)針畫纺裁。反之诫肠,逆時(shí)針。

func animationBezierPath() -> UIBezierPath {

        let bezierPath = UIBezierPath()
        // true--順時(shí)針
        let clockwise: Bool = fromPoint.x > toPoint.x

        // first circle
        bezierPath.addArcWithCenter(fromPoint, radius: radius, startAngle: CGFloat(M_PI_2), endAngle: CGFloat(M_PI), clockwise: clockwise)
        bezierPath.addArcWithCenter(fromPoint, radius: radius, startAngle: CGFloat(M_PI), endAngle: CGFloat(M_PI_2), clockwise: clockwise)

        // line
        bezierPath.moveToPoint(CGPointMake(fromPoint.x, fromPoint.y + radius))
        bezierPath.addLineToPoint(CGPointMake(toPoint.x, toPoint.y + radius))

        // second circle
        bezierPath.addArcWithCenter(toPoint, radius: radius, startAngle: CGFloat(M_PI_2), endAngle: CGFloat(M_PI), clockwise: clockwise)
        bezierPath.addArcWithCenter(toPoint, radius: radius, startAngle: CGFloat(M_PI), endAngle: CGFloat(M_PI_2), clockwise: clockwise)

        return bezierPath
    }

因?yàn)樽罱K線不見(jiàn)了欺缘,所以是strokeStart到了選中item的切點(diǎn)位置就結(jié)束了栋豫,strokeEnd到了路徑最終點(diǎn)。動(dòng)畫代碼如下:

func createAnimation(completion: () -> ()) -> CAAnimationGroup {

        let duration: CFTimeInterval = 0.75
        let strokeStartAnimation = CABasicAnimation(keyPath: "strokeStart")

        strokeStartAnimation.duration = duration
        strokeStartAnimation.fromValue = 0
        strokeStartAnimation.toValue = distance() / totalLength()

        let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")

        strokeEndAnimation.duration = duration
        strokeEndAnimation.fromValue = 0.1
        strokeEndAnimation.toValue = 1

        let animationGroup: CAAnimationGroup = CAAnimationGroup()

        animationGroup.duration = duration;
        animationGroup.animations = [strokeStartAnimation, strokeEndAnimation]
        animationGroup.delegate = self
        animationGroup.fillMode = kCAFillModeBoth;
        animationGroup.removedOnCompletion = false

        return animationGroup
    }

動(dòng)畫結(jié)束之后谚殊,需要將動(dòng)畫layer隱藏掉或者移除掉丧鸯。這里為了防止頻繁的創(chuàng)建layer,暫且只隱藏起來(lái)嫩絮。

問(wèn)題

這里碰到了一個(gè)問(wèn)題丛肢,就是在顯示circle時(shí),當(dāng)時(shí)我不想頻繁創(chuàng)建和移除circle剿干,直接設(shè)置opacity來(lái)操作隱藏顯示的話蜂怎,會(huì)感覺(jué)閃一下。而采用重新創(chuàng)建的方式置尔,就不會(huì)杠步。后來(lái)想了好久,才發(fā)現(xiàn)是CALayer隱式動(dòng)畫的問(wèn)題榜轿,操作CALayer的屬性幽歼,會(huì)默認(rèn)有個(gè)0.25s的動(dòng)畫。所以將隱式動(dòng)畫禁用后谬盐,一切完美了甸私。

UIView.animateWithDuration(0.3, animations: {
            
            CATransaction.begin()
            CATransaction.setDisableActions(true)
            self.outCircleLayer.opacity = show ? 1 : 0
            
            CATransaction.commit()
            
            self.normalImageView?.alpha = show ? 0 : 1

            }) { (flag) in
        }

最后

其實(shí)看了源碼之后還是覺(jué)得動(dòng)畫不是太復(fù)雜。很多炫酷的動(dòng)畫都是屬性的組合動(dòng)畫飞傀,或者是Bezier曲線變換什么的颠蕴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泣刹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子犀被,更是在濱河造成了極大的恐慌椅您,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寡键,死亡現(xiàn)場(chǎng)離奇詭異掀泳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)西轩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門员舵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人藕畔,你說(shuō)我怎么就攤上這事马僻。” “怎么了注服?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵韭邓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我溶弟,道長(zhǎng)女淑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任辜御,我火速辦了婚禮鸭你,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘擒权。我一直安慰自己袱巨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布碳抄。 她就那樣靜靜地躺著愉老,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纳鼎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天裳凸,我揣著相機(jī)與錄音贱鄙,去河邊找鬼。 笑死姨谷,一個(gè)胖子當(dāng)著我的面吹牛逗宁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梦湘,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼瞎颗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼件甥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哼拔,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤引有,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后倦逐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體譬正,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年檬姥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曾我。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡健民,死狀恐怖抒巢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秉犹,我是刑警寧澤蛉谜,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站凤优,受9級(jí)特大地震影響悦陋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筑辨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一俺驶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棍辕,春花似錦暮现、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抚太,卻和暖如春塘幅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尿贫。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工电媳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庆亡。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓匾乓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親又谋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拼缝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果娱局,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌咧七。在這里你可以看...
    每天刷兩次牙閱讀 8,471評(píng)論 6 30
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,860評(píng)論 25 707
  • 不知不覺(jué)中我成為一名驢友已經(jīng)兩年多衰齐,參加驢行不計(jì)其數(shù)。時(shí)間長(zhǎng)了猪叙,居然上了癮娇斩,一段時(shí)間不驢行,竟然心里如蟲撓般難受...
    玲瓏簡(jiǎn)書閱讀 1,040評(píng)論 0 3
  • 具體構(gòu)成描述 網(wǎng)絡(luò)(network)由若干結(jié)點(diǎn)(node)和連接這些結(jié)點(diǎn)的鏈路(link)組成穴翩∪冢互聯(lián)網(wǎng)是 "網(wǎng)絡(luò)的...
    hwk603閱讀 480評(píng)論 0 3
  • 時(shí)間:20170805星期六早6:00~6:50 地點(diǎn):云之家易效能十一堂課實(shí)踐班 參與人員:教練,班委芒帕,學(xué)員等 ...
    梅丫頭閱讀 608評(píng)論 0 3