iOS 戰(zhàn)斗機&跑車效果

期待這樣的特效.jpg

近來看到QQ音樂里面有一些酷酷的禮物效果赚瘦,手癢,從網上找到一些素材枷邪,嘗試做一下,效果有點粗糙诺凡,但是還是學到了一些東西东揣,故和大家一起探討分析一下。

先上跑車效果:

跑車.gif

然后是戰(zhàn)斗機效果:


飛機.gif

先說說這個跑車效果怎么做腹泌。
第一步:分析
跑車圖片和輪子圖片是一個整體嘶卧,無論是放大還是移動,一定是同步的凉袱。

第二步:搭建
跑車圖片上芥吟,放置前后輪子侦铜,輪子需要滾動,這里使用序列幀動畫來無限循環(huán)播放輪子的圖片钟鸵,給用戶一種滾動的效果钉稍。

車體原圖.png

第三步:動畫
這里使用關鍵幀動畫來控制跑車的移動和大小。
我們需要注意的是跑車盡可能的在屏幕中間停留棺耍,所以要控制不同關鍵幀的動畫時間贡未。

動畫操作:

- (void)startAnimation
{
    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];

    //大小動畫
    CAKeyframeAnimation *scaleAnimation = [self scaleKeyAnimation];
    
    //平移動畫
    CAKeyframeAnimation *transAnmation = [self translationAnimation];
    
    animationGroup.animations = @[scaleAnimation,transAnmation];

    
    animationGroup.duration = self.animateDuration;
    [self.layer addAnimation:animationGroup forKey:nil];
    
}

接下來是戰(zhàn)斗機的效果分析:

第一步:分析
等同于跑車的思路,戰(zhàn)斗機為整體蒙袍,平移操作即可俊卤。

第二步:搭建
戰(zhàn)斗機的五個螺旋槳需要不停地旋轉,所以這五個小部件都需要不停地做旋轉動畫害幅。

戰(zhàn)斗機主體.png

第三步:動畫
這里的動畫分為4個部分
1消恍、戰(zhàn)斗機出場動畫
2、投彈動畫
3矫限、戰(zhàn)斗機離場動畫
4哺哼、鉆石隱藏動畫

我們需要理清楚動畫的觸發(fā)時機:
1、戰(zhàn)斗機出場動畫叼风。
2取董、戰(zhàn)斗機出場動畫結束后,開始投彈動畫无宿。投彈動畫為序列幀動畫茵汰。
3、投彈動畫結束后孽鸡,戰(zhàn)斗機離場動畫與鉆石隱藏動畫同時開始蹂午。

動畫操作:

- (void)startAnimation
{
    
    //如果正在爆炸,也就意味之前的動畫沒結束
    if (self.isBooming) {

        //把動畫移除了
        [self.boomImageView.layer removeAnimationForKey:@"boomAnimation"];
        
        [self.boomImageView.layer removeAnimationForKey:@"boomOpacityAnimation"];

        //把爆炸視圖隱藏了
        [self hideBoomImageView];
    }

    //不在爆炸狀態(tài)
    self.isBooming = NO;
    self.boomImageView.hidden = YES;
    //把未完成的動畫移除掉
    [self.planeImageView.layer removeAnimationForKey:@"planeAnimation"];
    [self.boomImageView.layer removeAnimationForKey:@"boomOpacityAnimation"];
    [self.planeShadowImageView.layer removeAnimationForKey:@"shadowAnimation"];
    
    
    //構建新的動畫
    CAKeyframeAnimation *transAnmation = [self planeTranslationAnimation];
    CAKeyframeAnimation *shadowAnimation = [self shadowTranslationAnimation];
    
    //配置動畫屬性
    transAnmation.duration = self.showDuration;
    transAnmation.delegate = self;
    transAnmation.removedOnCompletion = NO;
    transAnmation.fillMode = kCAFillModeForwards;
    
    shadowAnimation.duration = self.showDuration;
    shadowAnimation.delegate = self;
    shadowAnimation.removedOnCompletion = NO;
    shadowAnimation.fillMode = kCAFillModeForwards;
    
    //添加動畫
    [self.planeImageView.layer addAnimation:transAnmation forKey:@"planeAnimation"];
    [self.planeShadowImageView.layer addAnimation:shadowAnimation forKey:@"shadowAnimation"];
    
    
}

額外的注意事項是:當我動畫未結束時彬碱,又重新開始了動畫豆胸,那么需要根據動畫的觸發(fā)時機來處理各個動畫。

該視圖很多屬性都公開了巷疼,為了保留足夠的外部定制晚胡,調用起來會稍微復雜一點,但這樣是值得的嚼沿。

調用跑車:

- (void)loadCustomCarImageView
{
    //跑車位置
    car = [[CarImageView alloc]initCarImageViewWithOriginCenter:CGPointMake(-240, 0)];
    //跑車開始動畫的位置
    car.startAnimatePoint = CGPointMake(0, 100);
    //跑車結束動畫的位置
    car.endAnimatePoint = CGPointMake(600, 500);
    //跑車的尺寸大小
    car.controlScaleArray = @[@"0.5",@"1",@"1.2"];
    
    //跑車途徑的點
    NSValue *onePoint = [NSValue valueWithCGPoint:CGPointMake(120, 150)];
    NSValue *twoPoint = [NSValue valueWithCGPoint:CGPointMake(180, 210)];
    NSValue *threePoint = [NSValue valueWithCGPoint:CGPointMake(240, 260)];
    car.controlPointArray = @[onePoint,twoPoint,threePoint];
    
    //移動時的幀動畫時間
    car.pointTimeArray = @[@0,@0.15,@0.45,@0.7,@0.85,@1];
    //尺寸的幀動畫時間
    car.scaleTimeArray = @[@0,@0.15,@0.45,@1];
    //整個動畫的時間
    car.animateDuration = 5.0;
    [self.view addSubview:car];
    
}

調用戰(zhàn)斗機:

- (void)loadPlaneView
{
    //初始化
    plane = [[PlaneView alloc]initPlaneView];
    
    //開始位置
    plane.startPoint = CGPointMake(PhoneScreen_WIDTH , 0);
    
    //展示時的位置估盘,從右向屏幕中間飛,途徑的點
    NSValue *onePoint = [NSValue valueWithCGPoint:CGPointMake(PhoneScreen_WIDTH-30, 50)];
    NSValue *twoPoint = [NSValue valueWithCGPoint:CGPointMake(PhoneScreen_WIDTH/2+50, PhoneScreen_HEIGHT/2-90)];
    //展示時的位置
    plane.showPointArray = @[onePoint,twoPoint];
    //展示時每一幀的時間骡尽,0-1之間
    plane.showTimeArray = @[@0,@0.15,@0.5,@1.0];
    
    
    
    //飛機離開時的遣妥,從屏幕中部向屏幕左側飛
    NSValue *oneLeavePoint = [NSValue valueWithCGPoint:CGPointMake(PhoneScreen_WIDTH/2-150, PhoneScreen_HEIGHT/2)];
    NSValue *twoLeavePoint =[NSValue valueWithCGPoint:CGPointMake(-200, PhoneScreen_HEIGHT/2+100)];
    //飛機位置
    plane.leavePointArray = @[oneLeavePoint,twoLeavePoint];
    //每一幀的時間
    plane.leaveTimeArray = @[@0,@0.5,@1.0];
    
    //飛機的初始位置,屏幕右側
    plane.startPoint = CGPointMake(PhoneScreen_WIDTH, 0);
    //飛機
    plane.stayPoint = CGPointMake(PhoneScreen_WIDTH/2, PhoneScreen_HEIGHT/2-70);
    
    //飛機出場時間(從最右側到屏幕中央的時間)
    plane.showDuration = 3.0;
    //飛機里長時間(從屏幕中央到最左側的時間)
    plane.leaveDuration = 2.0;
    //爆炸的時間攀细,也是飛機在屏幕中央停留的時間
    plane.boomDuration = 3.0;
    [self.view addSubview:plane];
}

至此箫踩,戰(zhàn)斗機和跑車動畫都實現了~

拋磚引玉爱态,期待能讓小伙伴們有所收獲,更期待各位大神的指點和建議班套。
整個項目因為有不少圖片肢藐,所以有15M,需要的小伙伴請到這里下載項目代碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末吱韭,一起剝皮案震驚了整個濱河市吆豹,隨后出現的幾起案子,更是在濱河造成了極大的恐慌理盆,老刑警劉巖痘煤,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異猿规,居然都是意外死亡衷快,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門姨俩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蘸拔,“玉大人,你說我怎么就攤上這事环葵〉髑希” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵张遭,是天一觀的道長邓萨。 經常有香客問我,道長菊卷,這世上最難降的妖魔是什么缔恳? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮洁闰,結果婚禮上歉甚,老公的妹妹穿的比我還像新娘。我一直安慰自己扑眉,他們只是感情好铃芦,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著襟雷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仁烹。 梳的紋絲不亂的頭發(fā)上耸弄,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音卓缰,去河邊找鬼计呈。 笑死砰诵,一個胖子當著我的面吹牛,可吹牛的內容都是我干的捌显。 我是一名探鬼主播茁彭,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扶歪!你這毒婦竟也來了理肺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤善镰,失蹤者是張志新(化名)和其女友劉穎妹萨,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體炫欺,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡乎完,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了品洛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片树姨。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桥状,靈堂內的尸體忽然破棺而出帽揪,到底是詐尸還是另有隱情,我是刑警寧澤岛宦,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布台丛,位于F島的核電站,受9級特大地震影響砾肺,放射性物質發(fā)生泄漏挽霉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一变汪、第九天 我趴在偏房一處隱蔽的房頂上張望侠坎。 院中可真熱鬧,春花似錦裙盾、人聲如沸实胸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庐完。三九已至,卻和暖如春徘熔,著一層夾襖步出監(jiān)牢的瞬間门躯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工酷师, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讶凉,地道東北人染乌。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像懂讯,于是被迫代替她去往敵國和親荷憋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,080評論 25 707
  • 文/陳雄輝 哪怨得東風不顧閑愁 水向東流 再無力捧你 癡戀了三春的臉 可記否 梨花落盡的瞬息 那無可搖曳的清白 也...
    情島漁夫閱讀 320評論 1 3
  • 說起上周六,真的是很難忘的一天譬挚!三段故事的經歷锅铅,讓周六那一天變得很充實。當然很多回憶是有遺憾的减宣!就好比上周六最后的...
    Cinko閱讀 265評論 3 18
  • 我愿意深深地扎入生活盐须,吮盡生活的骨髓,過得扎實漆腌,簡單贼邓,把一切不屬于生活的內容剔除得干凈利落,把生活逼到絕處闷尿,用最基...
    風中白樺閱讀 157評論 0 0