日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOSCoreAnimation动画系列教程(一):CABasicAnimation【包会】

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOSCoreAnimation动画系列教程(一):CABasicAnimation【包会】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文的最新版本已經發布在簡書[編程小翁]上,強烈建議到上查看簡書,[點擊這里跳轉]。

在iOS中,圖形可分為以下幾個層次:

越上層,封裝程度越高,動畫實現越簡潔越簡單,但是自由度越低;反之亦然。本文著重介紹Core Animation層的基本動畫實現方案。

在iOS中,展示動畫可以類比于顯示生活中的“拍電影”。拍電影有三大要素:演員+劇本+開拍,概念類比如下:

演員--->CALayer,規定電影的主角是誰 劇本--->CAAnimation,規定電影該怎么演,怎么走,怎么變換 開拍--->AddAnimation,開始執行

一、概念介紹

1.1CALayer是什么呢?

CALayer是個與UIView很類似的概念,同樣有layer,sublayer...,同樣有backgroundColor、frame等相似的屬性,我們可以將UIView看做一種特殊的CALayer,只不過UIView可以響應事件而已。一般來說,layer可以有兩種用途,二者不互相沖突:一是對view相關屬性的設置,包括圓角、陰影、邊框等參數,更詳細的參數請點擊這里;二是實現對view的動畫操控。因此對一個view進行core animation動畫,本質上是對該view的.layer進行動畫操縱。

1.2CAAnimation是什么呢?

CAAnimation可分為四種:

  • 1.CABasicAnimation
  • 通過設定起始點,終點,時間,動畫會沿著你這設定點進行移動??梢钥醋鎏厥獾腃AKeyFrameAnimation
  • 2.CAKeyframeAnimation
  • Keyframe顧名思義就是關鍵點的frame,你可以通過設定CALayer的始點、中間關鍵點、終點的frame,時間,動畫會沿你設定的軌跡進行移動
  • 3.CAAnimationGroup
  • Group也就是組合的意思,就是把對這個Layer的所有動畫都組合起來。PS:一個layer設定了很多動畫,他們都會同時執行,如何按順序執行我到時候再講。
  • 4.CATransition
  • 這個就是蘋果幫開發者封裝好的一些動畫

二、動手干活

實踐出真知,看個例子就知道:

比如我們想實現一個類似心跳的縮放動畫可以這么做,分為演員初始化、設定劇本、電影開拍三個步驟:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 - (void)initScaleLayer { ????//演員初始化 ????CALayer *scaleLayer = [[CALayer alloc] init]; ????scaleLayer.backgroundColor = [UIColor blueColor].CGColor; ????scaleLayer.frame = CGRectMake(60, 20 + kYOffset, 50, 50); ????scaleLayer.cornerRadius = 10; ????[self.view.layer addSublayer:scaleLayer]; ????[scaleLayer release]; ????? ????//設定劇本 ????CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; ????scaleAnimation.fromValue = [NSNumber?numberWithFloat:1.0]; ????scaleAnimation.toValue = [NSNumber?numberWithFloat:1.5]; ????scaleAnimation.autoreverses =?YES; ????scaleAnimation.fillMode = kCAFillModeForwards; ????scaleAnimation.repeatCount = MAXFLOAT; ????scaleAnimation.duration = 0.8; ????? ????//開演 ????[scaleLayer addAnimation:scaleAnimation forKey:@"scaleAnimation"]; }

?

1 2 3 4 5 - (void)viewDidLoad { ????[super?viewDidLoad]; ????// Do any additional setup after loading the view from its nib. ????[self?initScaleLayer]; }

  

效果請參考附圖中的藍色方塊。其他效果可以依葫蘆畫瓢輕松實現。想要實現不同的效果,最關鍵的地方在于CABasicAnimation對象的初始化方式中keyPath的設定。在iOS中有以下幾種不同的keyPath,代表著不同的效果:

此外,我們還可以利用GroupAnimation實現多種動畫的組合,在GroupAnimation中的各個動畫類型是同時進行的。

- (void)initGroupLayer { ????//演員初始化 ????CALayer *groupLayer = [[CALayer alloc] init]; ????groupLayer.frame = CGRectMake(60, 340+100 + kYOffset, 50, 50); ????groupLayer.cornerRadius = 10; ????groupLayer.backgroundColor = [[UIColor purpleColor] CGColor]; ????[self.view.layer addSublayer:groupLayer]; ????[groupLayer release]; ??? ????//設定劇本 ????CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; ????scaleAnimation.fromValue = [NSNumber?numberWithFloat:1.0]; ????scaleAnimation.toValue = [NSNumber?numberWithFloat:1.5]; ????scaleAnimation.autoreverses = YES; ????scaleAnimation.repeatCount = MAXFLOAT; ????scaleAnimation.duration = 0.8; ????? ????CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; ????moveAnimation.fromValue = [NSValue?valueWithCGPoint:groupLayer.position]; ????moveAnimation.toValue = [NSValue?valueWithCGPoint:CGPointMake(320 - 80, ??????????????????????????????????????????????????????????????????groupLayer.position.y)]; ????moveAnimation.autoreverses = YES; ????moveAnimation.repeatCount = MAXFLOAT; ????moveAnimation.duration = 2; ????? ????CABasicAnimation *rotateAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"]; ????rotateAnimation.fromValue = [NSNumber?numberWithFloat:0.0]; ????rotateAnimation.toValue = [NSNumber?numberWithFloat:6.0 * M_PI]; ????rotateAnimation.autoreverses = YES; ????rotateAnimation.repeatCount = MAXFLOAT; ????rotateAnimation.duration = 2; ????? ????CAAnimationGroup *groupAnnimation = [CAAnimationGroup animation]; ????groupAnnimation.duration = 2; ????groupAnnimation.autoreverses = YES; ????groupAnnimation.animations = @[moveAnimation, scaleAnimation, rotateAnimation]; ????groupAnnimation.repeatCount = MAXFLOAT; ????//開演 ????[groupLayer addAnimation:groupAnnimation forKey:@"groupAnnimation"]; }

  

1 2 3 4 5 - (void)viewDidLoad { ????[super viewDidLoad]; ????// Do any additional setup after loading the view from its nib. ????[self initGroupLayer]; }?

?完整的demo工程點CAAnimationDemo.zip下載?

=======================================================

by 編程小翁@博客園

from:?http://www.cnblogs.com/wengzilin/p/4250957.html

總結

以上是生活随笔為你收集整理的iOSCoreAnimation动画系列教程(一):CABasicAnimation【包会】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。