核心動畫——動畫組

来源:http://www.cnblogs.com/chengy134/archive/2016/04/15/5395357.html
-Advertisement-
Play Games

之前介紹了核心動畫之彈簧動畫,有關於核心動畫的結構圖大家都還記得吧 所以說動畫組屬於核心動畫,它的初始化和核心動畫初始化的方法一樣。那麼我就簡單的介紹一下動畫組 動畫組:CAAnimationGroup 可以讓動畫同時執行 動畫組中設置的時間控制類屬性會影響到動畫組內部動畫的時間控制類屬性 在動畫組 ...


之前介紹了核心動畫之彈簧動畫,有關於核心動畫的結構圖大家都還記得吧

所以說動畫組屬於核心動畫,它的初始化和核心動畫初始化的方法一樣。那麼我就簡單的介紹一下動畫組

動畫組:CAAnimationGroup 可以讓動畫同時執行

動畫組中設置的時間控制類屬性會影響到動畫組內部動畫的時間控制類屬性

在動畫組中去統一設置媒體時間控制類

 

 媒體控制時間的屬性

     1.CAMediaTiming媒體時間類協議

     核心動畫關於時間類的控制 是遵守了CAMediaTiming中的協議內容

     1.beginTime 動畫開始的時間 預設為0

     2.duration 動畫的持續時間 預設為0 持續時間 受速度的影響 實際的動畫完成時間 = 持續時間/速度

     3.speed 動畫播放的速度 預設為1 速度設置成0 可以暫停動畫

     speed 2秒  duration 60秒 動畫真正播放完成的時間 30秒

     4.timeOffset 動畫播放時間的偏移量

     5.repeatCount 動畫的迴圈次數 預設是0 只播放一次

     6.repeatDuration 動畫迴圈的持續時間  只能設置其中的一個屬性  repeatCount/repeatDuration

     7.autoreverses  是否以動畫的形式 返回到播放之前的狀態

     8.fillMode 設置當前對象在非活動時間段的狀態

     要想fillMode有效 需設置removedOnCompletion = NO

     kCAFillModeForwards 當動畫結束後,layer會一直保持著動畫最後的狀態

     kCAFillModeBackwards 立即進入動畫的初始狀態並等待動畫開始

     kCAFillModeBoth 動畫加入後開始之前 layer處於動畫初始狀態 動畫結束後layer保持動畫最後的狀態

     kCAFillModeRemoved 預設值 動畫結束後 layer會恢復到之前的狀態

 

 動畫組主要的屬性介紹:

    animations 動畫的數組 各種動畫

 

具體操作如下:

#import "ViewController.h"

@interface ViewController ()

//花瓣
@property (nonatomic, strong) CALayer *petalLayer;
//背景
@property (nonatomic, strong) CALayer *layer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blackColor];
    [self.view.layer addSublayer:self.layer];
    [self.view.layer addSublayer:self.petalLayer];
    
}

//點擊掉落 讓圖層移動的動畫  返回的是:移動的動畫 endPoint:終點
- (CAKeyframeAnimation *)move:(CGPoint)endPoint{
    CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    UIBezierPath *path = [UIBezierPath bezierPath];
    //設置起始點
    [path moveToPoint:self.petalLayer.position];
    //畫曲線的方法addCurveToPoint:終點 controlPoint1:<#(CGPoint)#> controlPoint2:<#(CGPoint)#>
    [path addCurveToPoint:endPoint controlPoint1:CGPointMake(50, 150) controlPoint2:CGPointMake(300, 250)];
    keyFrame.path = path.CGPath;
    //節奏動畫不是勻速 kCAAnimationPaced
    keyFrame.calculationMode = kCAAnimationCubicPaced;
    return keyFrame;
}
/*
 旋轉動畫
 1.使用基礎動畫,其中的一個變化
 2.選擇哪一個屬性transform.rotation.z
 可以通過改變animationWithKeyPath來改變動畫的屬性:
     transform.scale = 比例轉換
     transform.scale.x
     transform.scale.y
     transform.rotation.z
     opacity = 透明度
     zPosition
     backgroundColor 背景顏色
     cornerRadius 柺角
     borderWidth 邊框的寬度
     bounds
     contents 內容
     contentsRect
     frame
     hidden
     masksToBounds
     position
     shadowColor
     shadowOffset
     shadowOpacity
     shadowRadius
 */

//旋轉動畫 讓花版掉落的時候自動旋轉
- (CABasicAnimation *)rotation{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    //M_PI = 3.1415926....
    //M_PI_2 = 一半    M_PI_4就是四分之一
    animation.fromValue = @(M_PI_4);
    animation.toValue = @(M_PI_4*4);
    //一直在旋轉
    //animation.repeatCount = HUGE;
    //以動畫的形式讓他回去
    //animation.autoreverses = YES;
    return animation;
}


//花瓣掉落的時候讓它慢慢放大 放大動畫
- (CABasicAnimation *)moveToBig{
    
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];
    animation.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, self.petalLayer.bounds.size.width, self.petalLayer.bounds.size.height)];
    animation.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, self.petalLayer.bounds.size.width*1.3, self.petalLayer.bounds.size.height*1.3)];
    return animation;
}


- (void)animationGroup:(CGPoint)endPoint{
    //初始化
    CAAnimationGroup *group = [CAAnimationGroup animation];
    //把想要同時運行的動畫添加到動畫組中
    group.animations = @[[self rotation],[self move:endPoint],[self moveToBig]];
    //動畫組完成的整體時間
    group.duration = 5;
    //不想讓花瓣掉落停止時回到原來的位置 設置它的fillMode
    group.removedOnCompletion = NO;
    group.fillMode = kCAFillModeBoth;
    [self.petalLayer addAnimation:group forKey:@""];
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [self animationGroup:[[touches anyObject] locationInView:self.view]];
}

- (CALayer *)petalLayer{
    if (_petalLayer) {
        return _petalLayer;
    }
    _petalLayer = [CALayer layer];
    _petalLayer.position = CGPointMake(self.view.center.x, 50);
    UIImage *image =[UIImage imageNamed:@"2"];
    _petalLayer.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
    _petalLayer.contents = (id)image.CGImage;
    
    return _petalLayer;
}

- (CALayer *)layer{
    if (_layer) {
        return _layer;
    }
    _layer = [CALayer layer];
    _layer.position = CGPointMake(self.view.center.x, self.view.center.y+100);
    UIImage *image =[UIImage imageNamed:@"4"];
    _layer.bounds = CGRectMake(0, 0, image.size.width/2, image.size.height/2);
    _layer.contents = (id)image.CGImage;
    
    return _layer;
}

@end

效果如下:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 源文件在這裡:http://pan.baidu.com/s/1kVKrbkb ...
  • 前言 公司的產品同時適配 iPhone 和 iPad ,並堅持用 Storyboard 來做適配,今天又踩一個坑(以前遇到過)還以為是 XCode 的鬼毛病。 聲明 歡迎轉載,但請保留文章原始出處:) 博客園:http://www.cnblogs.com 農民伯伯: http://over140.c ...
  • a.我們先來體驗一下在Linux下用彙編編程的感覺,見代碼 編譯方法: nasm -f elf hello.asm -o hello.o ld -m elf_i386 -s -o hello hello.o ./hello 運行結果是列印出Hello, world! 入口點預設的是_start,我們 ...
  • 核心動畫——CAAnimation 需要的框架:CoreAnimation -> 基礎框架 CAAnimation 分為三大類: 處理動畫的類 (基類 不能使用) ①CAPropertyAnimation 屬性動畫 -> 通過改變屬性值產生動畫效果 <1>CABasicAnimation 基礎動畫 ...
  • 轉場動畫:CATransition 屬性介紹: ①type:轉場動畫的動畫效果 kCATransitionFade 交叉淡化過渡 kCATransitionMoveIn 新視圖移到舊視圖上面 kCATransitionPush 新視圖把舊視圖推出去 kCATransitionReveal 將舊視圖移 ...
  • 直接上代碼。。。。 public class CastView7 extends View{ private Paint linePaint;//坐標系的直線畫筆 private Paint zhexianPaint;//折現畫筆 private Paint dianPaint;//點的畫筆 pri ...
  • 自從Fragment出現,曾經有段時間,感覺大家談什麼都能跟Fragment談上關係,做什麼都要問下Fragment能實現不~~~哈哈,是不是有點過~~~ 本篇博客力求為大家說明Fragment如何產生,什麼是Fragment,Fragment生命周期,如何靜態和動態的使用Fragment,Frag ...
  • 在android studio 1.5.1正式版中,新建的activity繼承的是AppCompatActivity,但是我們隱藏標題欄用代碼的方式再使用的時候就會引發崩潰,代碼如下: 我們原來使用的方式在在 setContentView(R.layout.activity_navigation)以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...