天天看點

動畫基礎

        所有核心動畫的動畫類都是從 CAAnimation類繼承而來

        CAAnimation 實作了 CAMediaTiming協定,提供了動畫的持續時間,速度,和重複計數

        CAAnimation 也實作了 CAAction協定。該協定為圖層觸發一個動畫動作提供了提供 标準化響應

        CATransition 提供了一個圖層變化的過渡效果,它能影響圖層的整個内容。 動畫進行的時候淡入淡出(fade)、推(push)、顯露(reveal)圖層的内容。這些過渡效果可以擴充到你自己定制的Core Image 濾鏡

        CAAnimationGroup 允許一系列動畫效果組合在一起,并行顯示動畫

        CAPropertyAnimation是一個抽象的子類,它支援動畫的顯示圖層的關鍵路徑中指定的屬性

        CABasicAnimation 簡單的為圖層的屬性提供修改。

        CAKeyframeAnimation支援關鍵幀動畫,你可以指定的圖層屬性的關鍵路徑動畫,包括動畫的每個階段的價值,以及關鍵幀時間和計時功能的一系列值。在 動畫運作是,每個值被特定的插入值替代

        核心動畫的 CAConstraint 類 是一個布局管理器,它可以指定子圖層類限制于你指定的限制集合。每個限制(CAConstraint類的執行個體封裝)描述層的幾何屬性(左,右,頂部或底部的邊緣或水準或垂直中心)的關系,關系到其同級之一的幾何屬性層或superlayer

        核心動畫的圖層和 Cocoa 的視圖在很大程度上沒有一定的相似性,但是他們兩者最大的差別是,圖層不會直接渲染到螢幕上

        試圖的position坐标和anchorPoint有關

        sublayerTransform屬性指定的矩陣隻會影響圖層的子圖層,而不會對 圖層本身産生影響

        transform 屬性指定的矩陣結合圖層的anchorPoint屬性作用于圖層和圖層的子圖層上 面

        旋轉的機關采用弧度(radians),而不是角度(degress)。以下兩個函數,你可以在 弧度和角度之間切換

CGFloat DegreesToRadians(CGFloat degrees) {returndegrees * M_PI / 180;};

CGFloat RadiansToDegrees(CGFloat radians) {returnradians * 180 / M_PI;};
           

無法正常運作:

        替換的辦法是,你必須通過 setValue:forKeyPath:或者valueForKeyPath:方法,具體如下:

myLayer.transform.rotation.x=0;

[myLayer setValue:[NSNumber numberWithInt:0]forKeyPath:@"transform.rotation.x"];
           

        如果一個圖層的屬性 needsDisplayOnBoundsChange被設定為YES 的時候,當圖層的bounds屬性改變的時候,圖層的内容将會被重新緩存起來。預設情況下圖層的needsDisplayOnBoundsChange屬性值為NO。

給CALayer提供内容

        1。包含圖檔内容的 CGImageRef來顯式的設定圖層的contents 的屬性。

        2。指定一個委托,它提供或者重繪内容。

        3。繼承 CALayer 類重載顯示的函數

建立一個委托類實

        displayLayer:或 drawLayer:inContext:

- (void)displayLayer:(CALayer *)theLayer

{

    // check the value of the layer's state key

    if ([[theLayer valueForKey:@"state"] boolValue])

    {

        // display the yes image

        theLayer.contents=[someHelperObjectloadStateYesImage];

    }

    else {

        // display the no image

        theLayer.contents=[someHelperObjectloadStateNoImage];

    }

}
           

        如果你必須重繪圖層的内容,而不是通過加載圖檔,那你需要實作drawLayer:inContext:方法。通過委托可以決定哪些内容是需要的并使用CGContextRef來重繪内容。

        執行個體重新緩存其内容,可以通過發送以下任何一個方法 setNeedsDisplay或setNeedsDisplayInRect:的消息,亦或者設定圖層的needsDisplaOnBoundsChange屬性為 YES

        CALayer 的屬性 contentsGravity允許你在圖層的邊界内容修改圖層的contents圖檔的位置或者伸縮值。預設情況下,内容的圖像完全填充層的邊界,忽視自然的圖像 寬高比 contentsGravity屬性值:

        CABasicAnimation提供了在圖層的屬性值間簡單的插入。 CAKeyframeAnimation提供支援關鍵幀動畫。你指定動畫的一個圖層屬性的關鍵路徑,一個表示在動畫的每個階段的價值的數組,還有一個關鍵幀時間的數組和時間函數。

        CATransition提供了一個影響整個圖層的内容過渡效果。在動畫顯示過程中采用淡出(fade)、推出(push)、顯露(reveal)圖層的内容。常用的過渡效果可以通過提供你自己定制的核心圖像濾鏡來擴充

CABasicAnimation *_basicAnimation= [CABasicAnimation animationWithKeyPath:@"opacity"];

   _basicAnimation.duration=3.0;

   _basicAnimation.repeatCount=2;

   _basicAnimation.autoreverses=YES;

   _basicAnimation.fromValue=[NSNumber numberWithFloat:1.0];

   _basicAnimation.toValue=[NSNumber numberWithFloat:0.0];

    [self.m_imageViewBg.layeraddAnimation:_basicAnimation forKey:@"animateOpacity"];
           

我們可以通過animationWithKeyPath鍵值對的方式來改變動畫

        animationWithKeyPath的值:

        transform.scale= 比例轉換

        transform.scale.x =闊的比例轉換

        transform.scale.y =高的比例轉換

        transform.rotation.z =平面圖的旋轉

        opacity = 透明度

        margin

        zPosition

        backgroundColor

        cornerRadius

        borderWidth

        bounds

        contents

        contentsRect

        cornerRadius

        frame

        hidden

        mask

        masksToBounds

        opacity

        position

        shadowColor

        shadowOffset

        shadowOpacity

        shadowRadius

[self. ui_View.layerremoveAllAnimations];

   

   CABasicAnimation *pulse= [CABasicAnimation animationWithKeyPath:@"transform.scale"];

   pulse.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

   pulse.duration = 0.5 + (rand() % 10) * 0.05;

   pulse.repeatCount = 1;

   pulse.autoreverses = YES;

   pulse.fromValue =[NSNumber numberWithFloat:.8];

   pulse.toValue =[NSNumber numberWithFloat:1.2];

   [self.ui_View.layer addAnimation:pulseforKey:nil];

// bounds

 

CABasicAnimation *anim = [CABasicAnimationanimationWithKeyPath:@"bounds"];

   anim.duration = 1.f;

   anim.fromValue =[NSValue valueWithCGRect:CGRectMake(0,0,10,10)];

   anim.toValue =[NSValue valueWithCGRect:CGRectMake(10,10,200,200)];

   anim.byValue  = [NSValuevalueWithCGRect:self. ui_View.bounds]; 

//    anim.toValue= (id)[UIColor redColor].CGColor;

//   anim.fromValue =  (id)[UIColorblackColor].CGColor;

   

   anim.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

   anim.repeatCount = 1;

   anim.autoreverses = YES;

   

   [ui_View.layeraddAnimation:anim forKey:nil];

//cornerRadius

 

   CABasicAnimation*anim2 = [CABasicAnimationanimationWithKeyPath:@"cornerRadius"];

   anim2.duration = 1.f;

   anim2.fromValue =[NSNumber numberWithFloat:0.f];

   anim2.toValue =[NSNumber numberWithFloat:20.f];

   anim2.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

   anim2.repeatCount = CGFLOAT_MAX;

   anim2.autoreverses = YES;

   

   [ui_View.layeraddAnimation:anim2 forKey:@"cornerRadius"];

//contents

 

CABasicAnimation *anim = [CABasicAnimationanimationWithKeyPath:@"contents"];

   anim.duration = 1.f;

   anim.fromValue =(id)[UIImageimageNamed:@"1.jpg"].CGImage;

   anim.toValue =(id)[UIImageimageNamed:@"2.png"].CGImage;

//   anim.byValue  = (id)[UIImageimageNamed:@"3.png"].CGImage;

//    anim.toValue= (id)[UIColor redColor].CGColor;

//   anim.fromValue =  (id)[UIColorblackColor].CGColor;

   

   anim.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

   anim.repeatCount = CGFLOAT_MAX;

   anim.autoreverses = YES;

   

   [ui_View.layeraddAnimation:anim forKey:nil];

 

[ui_View.layersetShadowOffset:CGSizeMake(2,2)];

   [ui_View.layersetShadowOpacity:1];

   [ui_View.layersetShadowColor:[UIColorgrayColor].CGColor];

//    

   CABasicAnimation *anim =[CABasicAnimation animationWithKeyPath:@"shadowColor"];

   anim.duration = 1.f;

   anim.toValue =(id)[UIColorredColor].CGColor;

   anim.fromValue =  (id)[UIColorblackColor].CGColor;

   

   anim.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

   anim.repeatCount = CGFLOAT_MAX;

   anim.autoreverses = YES;

   

   [ui_View.layeraddAnimation:anim forKey:nil];

   

   CABasicAnimation *_anim= [CABasicAnimation animationWithKeyPath:@"shadowOffset"];

   _anim.duration = 1.f;

   _anim.fromValue =[NSValue valueWithCGSize:CGSizeMake(0,0)];

   _anim.toValue =[NSValue valueWithCGSize:CGSizeMake(3,3)];

   

   _anim.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

   _anim.repeatCount = CGFLOAT_MAX;

   _anim.autoreverses = YES;

   

   [ui_View.layeraddAnimation:_anim forKey:nil];

   

   

   CABasicAnimation *_anim1= [CABasicAnimation animationWithKeyPath:@"shadowOpacity"];

   _anim1.duration = 1.f;

   _anim1.fromValue =[NSNumber numberWithFloat:0.5];

   _anim1.toValue =[NSNumber numberWithFloat:1];

   

   _anim1.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

   _anim1.repeatCount = CGFLOAT_MAX;

   _anim1.autoreverses = YES;

   

   [ui_View.layeraddAnimation:_anim1 forKey:nil];

   

   

   

   CABasicAnimation *_anim2= [CABasicAnimation animationWithKeyPath:@"shadowRadius"];

   _anim2.duration = 1.f;

   _anim2.fromValue =[NSNumber numberWithFloat:10];

   _anim2.toValue =[NSNumber numberWithFloat:5];

   

   _anim2.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

   _anim2.repeatCount = CGFLOAT_MAX;

   _anim2.autoreverses = YES;

   

   [ui_View.layeraddAnimation:_anim2 forKey:nil];
           

        CAScrollLayer 對象的滾動區域的範圍在它的子圖層裡面定義。

        CAScrollLaye 不提供鍵盤或滑鼠事件處理,也不提供可見的滾動條。

        CATextLayer可以友善的從字元串或字元串的内容建立一個圖層類的内容

        CATiledLayer 允許遞增的顯示大而複雜的圖檔

        CAEAGLLayer 提供了一個OpenGLES渲染環境

        CALayer 的還擴充了 NSKeyValueCoding的非正式協定,加入預設鍵值和額外的結構類型的自動對象包裝(CGPoint,CGSize,CGRect,CGAffineTransform和 CATransform3D)的支援,并提供許多這些結構的關鍵路徑領域的通路

繼續閱讀