核心動畫——CAAnimation

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

核心動畫——CAAnimation 需要的框架:CoreAnimation -> 基礎框架 CAAnimation 分為三大類: 處理動畫的類 (基類 不能使用) ①CAPropertyAnimation 屬性動畫 -> 通過改變屬性值產生動畫效果 <1>CABasicAnimation 基礎動畫 ...


 核心動畫——CAAnimation

 需要的框架:CoreAnimation   ->  基礎框架

 CAAnimation 分為三大類:     處理動畫的類 (基類 不能使用)

 ①CAPropertyAnimation         屬性動畫 -> 通過改變屬性值產生動畫效果

   <1>CABasicAnimation        基礎動畫 -> 只能是兩個點之間的變化

       CASpringAnimation      彈簧動畫 (彈動效果)

   <2>CAKeyframeAnimation     關鍵幀動畫 -> 可以添加多個點的變化或者添加路徑

 ②CAAnimationGroup            動畫組 -> 可以同時添加多種動畫  達到預期效果

 ③CATransition                轉場動畫 -> 給視圖切換的時候添加動畫效

下麵給大家畫一個結構圖,可以讓大家更容易的瞭解

 CALayer 圖層

 UIView 視圖 -> 可以跟用戶交互 -> rootLayer 發生改變子圖層也會發生改變 rootLayer沒有動畫效果

 button 不止有一個視圖 改變的只是其中一個視圖的rootLayer -> 顯示 未被裁切的邊框

 CALayer -> 不可以跟用戶交互 只能顯示內容 發生改變子圖層不會跟隨發生改變 本身自帶動畫效果(改變屬性效果的時候) -> 隱式動畫 

 CALayer可以設置的屬性

                 bounds 邊境範圍

                 position 中心點

                 zPosition z軸中心點

                 anchorPoint 錨點   

                 anchorPointZ Z軸錨點

                 transform 轉換形態

                 frame NO. Animatable 坐標

                 hidden 隱藏

                 doubleSided 圖層背面是否顯示

                 geometryFlipped 翻轉 顛倒

                 masksToBounds 裁切邊境

                 contents 內容

                 opaque 不透明度

                 allowsEdgeAntialiasing 是否使用 變形後的抗鋸齒

                 backgroundColor 背景顏色

                 borderWidth 邊框寬

                 borderColor 邊框顏色

                 opacity 不透明度

                 shadowColor 陰影顏色

                 shadowOpacity 陰影不透明度

                 rasterizationScale 防止Retina屏幕像素化

                 shadowOffset 陰影偏移量

                 shadowRadius 陰影的半徑

✮✮✮✮✮錨點的最大值是1,1 最小值是0,0 預設值是0.5,0.5當視圖改變的時候是以錨點為基點去改變的

     錨點的值與位置 

     0,0 = 在圖層的左上角  

     0,1 = 圖層的左下角  

     1,0 = 圖層的右上角

     1,1 = 在圖層的右下角 

 錨點的計算公式:錨點值 = 錨點在視圖上的位置.x.y/視圖的寬高

下麵就鐘錶為例介紹一下核心動畫:

#import "ViewController.h"

#define Angle(a) (a)*M_PI/180
#define SAngle 6 //每秒旋轉多少度

@interface ViewController ()
{
    CALayer *layer;
    float s;
}

@property(nonatomic,strong)CALayer *pointLayer;
@property(nonatomic,strong)CALayer *minuteLayer;
@property(nonatomic,strong)CALayer *SecondtLayer;

@end


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //**圖層不能跟用戶交互,不能添加響應事件
    //初始化CALayer  addSubLayer:添加到父圖層的方法
    /*
    layer = [CALayer layer];
    layer.frame = CGRectMake(0, 0, 100, 100);
    layer.cornerRadius = 50;
    layer.backgroundColor = [UIColor yellowColor].CGColor;
    [self.view.layer addSublayer:layer];
    */
    
    
    UIImageView *image = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.width)];
    image.image = [UIImage imageNamed:@"biaopan"];
    image.contentMode = UIViewContentModeScaleAspectFit;
    image.center = self.view.center;
    [self.view addSubview:image];
    
    
    self.SecondtLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.SecondtLayer.contents = (id)[UIImage imageNamed:@"miaozhen"].CGImage;
    
    self.minuteLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.minuteLayer.contents = (id)[UIImage imageNamed:@"fenzhen"].CGImage;
    
    self.pointLayer.anchorPoint = CGPointMake(0.5, 0.9);
    //圖層上要的是顏色CGColorRef 圖片CGImageRef
    self.pointLayer.contents = (id)[UIImage imageNamed:@"shizhen"].CGImage;
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(start) userInfo:nil repeats:YES];
}

- (void)start{
    
    //日曆的一個類NSCalendar 獲得年月日時分秒
    //NSDateComponents 組件
    
    NSCalendar *calendar = [NSCalendar currentCalendar];
    ///(NSCalendarUnit)需要的組件  獲得哪個日期的組件
    NSDateComponents *component = [calendar components:NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:[NSDate date]];
    
    s = component.second*SAngle;
    self.SecondtLayer.transform = CATransform3DMakeRotation(Angle(s),0, 0, 1);
    self.SecondtLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.SecondtLayer.contents = (id)[UIImage imageNamed:@"miaozhen"].CGImage;
    
    float m = component.minute*SAngle;
    self.minuteLayer.transform = CATransform3DMakeRotation(Angle(m),0, 0, 1);
    self.minuteLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.minuteLayer.contents = (id)[UIImage imageNamed:@"fenzhen"].CGImage;
    
    float h = component.hour*SAngle;
    self.pointLayer.transform = CATransform3DMakeRotation(Angle(h), 0, 0, 1);
    self.pointLayer.anchorPoint = CGPointMake(0.5, 0.9);
    self.pointLayer.contents = (id)[UIImage imageNamed:@"shizhen"].CGImage;
}

- (CALayer *)pointLayer{
    if (_pointLayer) {
        return _pointLayer;
    }
    _pointLayer = [CALayer layer];
    _pointLayer.bounds = CGRectMake(0, 0, 29, 200);
    _pointLayer.position = self.view.center;
    [self.view.layer addSublayer:_pointLayer];
    return _pointLayer;
}

- (CALayer *)minuteLayer{
    if (_minuteLayer) {
        return _minuteLayer;
    }
    _minuteLayer = [CALayer layer];
    _minuteLayer.bounds = CGRectMake(0, 0, 21, 210);
    _minuteLayer.position = self.view.center;
    [self.view.layer addSublayer:_minuteLayer];
    return _minuteLayer;
}

- (CALayer *)SecondtLayer{
    if (_SecondtLayer) {
        return _SecondtLayer;
    }
    _SecondtLayer = [CALayer layer];
    _SecondtLayer.bounds = CGRectMake(0, 0, 21, 230);
    _SecondtLayer.position = self.view.center;
    [self.view.layer addSublayer:_SecondtLayer];
    return _SecondtLayer;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    /*
    UITouch *touch = [touches anyObject];
    layer.position = [touch locationInView:self.view];
    CGFloat width = CGRectGetWidth(layer.bounds)!= 100?100:25;
    layer.bounds = CGRectMake(0, 0, width, width);
    
    CGColorRef color = [UIColor lightGrayColor].CGColor != layer.backgroundColor?[UIColor lightGrayColor].CGColor:[UIColor yellowColor].CGColor;
    layer.backgroundColor = color;
    layer.shadowColor = [UIColor blackColor].CGColor;
    layer.geometryFlipped = YES;
    layer.cornerRadius = layer.cornerRadius != 50?50:0;
    //圖層的透明度
    layer.opacity = 0;
    */
    
    //緢點
    self.SecondtLayer.transform = CATransform3DMakeRotation(Angle(Angle(60)), 0, 0, 1);
    self.minuteLayer.transform = CATransform3DMakeRotation(Angle(s/60), 0, 0, 1);
    self.pointLayer.transform = CATransform3DMakeRotation(Angle(s/360), 0, 0, 1);
    
    
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    //layer.opacity = 1;
    self.pointLayer.transform = CATransform3DIdentity;
    
}


@end

效果如下:

 


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

-Advertisement-
Play Games
更多相關文章
  • 系統是cenos6.7 64位的,預設mysql5.7.11下載到/usr/local/src,安裝目錄在/app/local/mysql目錄下,mysql數據放置目錄/app/local/data。mysql從5.1後採用cmake方式編譯安裝,所以要先編譯安裝cmake工具,也可以採用yum方式 ...
  • Question: 初步理解多維資料庫和關係型資料庫都是表存儲,只不過是在多維數據集里叫做事實表、維表,做分析的話關係型資料庫也可以做到的呀?(書上說多維資料庫的查詢速度更快一點,可是為什麼會更快呢?)多維資料庫和關係型資料庫單單是查詢速度上更優嗎?還有會出於什麼考慮來建多維資料庫呢? Answer ...
  • 環境配置 在 Java 程式中如果要使用 MongoDB,你需要確保已經安裝了 Java 環境及 MongoDB JDBC 驅動。 本章節實例時候 Mongo 3.x 以上版本。 你可以參考本站的Java教程來安裝Java程式。現在讓我們來檢測你是否安裝了 MongoDB JDBC 驅動。 首先你必 ...
  • 分片 在Mongodb裡面存在另一種集群,就是分片技術,可以滿足MongoDB數據量大量增長的需求。 當MongoDB存儲海量的數據時,一臺機器可能不足以存儲數據也足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多台機器上分割數據,使得資料庫系統能存儲和處理更多的數據。 為什麼使用分片 複製所有的 ...
  • 今天無意中在網上看到了關於oracle誤刪除數據恢復的一條信息,發現的確很好使,下麵就我的測試向大家彙報下。 1. select * from t_viradsl2 t //查詢t_viradsl2中所有的數據,可以看到三條數據 2. delete t_viradsl2 //刪除t_viradsl2 ...
  • 源文件在這裡: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,我們 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...