• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Animations開源動效分析(二)POP-Stroke動畫

    1. 本教程源碼Animations 作者 YouXianMing,建議配合源碼項目食用

    2. Facebook pop動畫框架簡易教程請移步 Facebook Pop 使用指南

    3. CoreAnimation不簡易教程

    4. 如果不想看第三條的教程,也要弄明白CALayer的隱式動畫,否則看本文會疑惑,請移步CALayer的隱式動畫和顯式動畫

    CAMediaTimingFunction

    今天我們來看一下研究一下CAMediaTimingFunction類,它是一個動畫的時間線控制類,他所控制的時間線,可以是是一條直線、曲線或者折線,如下:

    poster.jpg

    這是用一個開源軟件生成的CAMediaTimingFunction,軟件地址是keefo/CATweaker

    可見,一般自定義的CAMediaTimingFunction通過調用

    /* Creates a timing function modelled on a cubic Bezier curve. The end
     * points of the curve are at (0,0) and (1,1), the two points 'c1' and
     * 'c2' defined by the class instance are the control points. Thus the
     * points defining the Bezier curve are: '[(0,0), c1, c2, (1,1)]' */
    
    + (instancetype)functionWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;
    
    - (instancetype)initWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;

    兩個方法,傳入四個位置點參數生成。 注:上圖中XY軸區間都是[0,1];

    這個類,在什么地方用到呢?

    1. CALayer的隱式和顯式動畫,CATransactionanimationTimingFunction設置。

    2. CAKeyframeAnimation有相關設置。

    3. CABasicAnimation是線性的動畫,一條直線。

    4. CASpringAnimation彈簧動畫是也是有一個特殊的走向,屬于CAMediaTimingFunction的特殊封裝。

    5. POP也借用了CAMediaTimingFunction類實現非線性動畫。

    下面這個網站可以在線調試,cubic-bezier,雖然是給CSS工程師用的,但是通用的。
    圖片描述

    上圖中,藍色的方塊的運動就是線性的,紅色方塊是非線性的。

    iOS7開始,iOS系統大量引入了非線性動畫。

    0-example-2.gif
    0-example-1.gif

    上圖引用自 使用 iOS 8 Spring Animation API 創建動畫

    Spring動畫

    彈簧(Spring)動畫是一種特殊曲線的非線性動畫,因為用的地方太多,所以無論是CoreAnimation還是POP,都將其進行了封裝CASpringAnimation,POPSpringAnimation

    兩者有一點區別,參考源碼中的CASpringAnimationPOP-Spring動畫參數詳解
    POPSpringAnimation

    POP-Stroke動畫

    687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3630373534322f3230313531312f3630373534322d32303135313131373131333135333337342d313337303739333939372e676966

    今天我們來分析一下POP-Stroke動畫的源代碼,首先interface中聲明了一個CAShapeLayer是中心的圓,timer是一個定時器。這個GCDTimer是作者對GCD進行的一層對象化封裝。

    @interface PopStrokeController ()
    
    @property (nonatomic, strong) CAShapeLayer  *circleShape;
    @property (nonatomic, strong) GCDTimer      *timer;
    
    @end

    實現的思路是,定時改變CAShapeLayer的startStoke和endStoke屬性,改變圓的繪制弧度,使用POP的Spring動畫控制其改變數值。

    - (void)setup {
        
        [super setup];
        
        self.circleShape           = [CAShapeLayer layer];
        self.circleShape.strokeEnd = 0.f;
        self.circleShape.lineCap   = kCALineCapRound;
        
        StrokeCircleLayerConfigure *config = [StrokeCircleLayerConfigure new];
        config.lineWidth                   = 4.f;
        config.startAngle                  = 0;
        config.endAngle                    = M_PI * 2;
        config.radius                      = 55.f;
        config.circleCenter                = self.contentView.middlePoint;
        config.strokeColor                 = [UIColor cyanColor];
        [config configCAShapeLayer:self.circleShape];   
        [self.contentView.layer addSublayer:self.circleShape];
        
        _timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];
    
        [_timer event:^{
            
            CGFloat value1 = arc4random() % 101 / 100.f;
            CGFloat value2 = arc4random() % 101 / 100.f;
            
            POPSpringAnimation *strokeAnimationEnd = [POPSpringAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeEnd];
            strokeAnimationEnd.toValue             = @(value1 > value2 ? value1 : value2);
            strokeAnimationEnd.springBounciness    = 12.f;
            
            POPSpringAnimation *strokeAnimationStart = [POPSpringAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeStart];
            strokeAnimationStart.toValue             = @(value1 < value2 ? value1 : value2);
            strokeAnimationStart.springBounciness    = 12.f;
            
            POPBasicAnimation *strokeAnimationColor  = [POPBasicAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeColor];
            strokeAnimationColor.toValue             = (__bridge id)([self randomColor].CGColor);
            
            [self.circleShape pop_addAnimation:strokeAnimationEnd forKey:@"layerStrokeAnimation"];
            [self.circleShape pop_addAnimation:strokeAnimationStart forKey:@"layerStrokeAnimation1"];
            [self.circleShape pop_addAnimation:strokeAnimationColor forKey:@"layerStrokeAnimation2"];
            
        } timeIntervalWithSecs:1];
        
        [_timer start];
    }
    
    - (UIColor *)randomColor {
    
        return [UIColor colorWithRed:arc4random() % 101 / 100.f
                               green:arc4random() % 101 / 100.f
                                blue:arc4random() % 101 / 100.f
                               alpha:1];
    }

    我們可以看到,POP支持了CALayer的所有動畫屬性,上面代碼中用的

    NSString * const kPOPShapeLayerStrokeStart = @"shapeLayer.strokeStart";
    NSString * const kPOPShapeLayerStrokeEnd = @"shapeLayer.strokeEnd";
    NSString * const kPOPShapeLayerStrokeColor = @"shapeLayer.strokeColor";

    分別對應CAShapeLayer的繪制顏色,起始比例區間。

    /* The color to fill the path's stroked outline, or nil for no stroking.
     * Defaults to nil. Animatable. */
    
    @property(nullable) CGColorRef strokeColor;
    
    /* These values define the subregion of the path used to draw the
     * stroked outline. The values must be in the range [0,1] with zero
     * representing the start of the path and one the end. Values in
     * between zero and one are interpolated linearly along the path
     * length. strokeStart defaults to zero and strokeEnd to one. Both are
     * animatable. */
    
    @property CGFloat strokeStart;
    @property CGFloat strokeEnd;

    然后通過生成隨機數的方式,用定時器定時改變,同時隨機改變了顏色。所以總共使用了三個Spring動畫。

    相同原理的Demo還有Easing-圓環動畫

    687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3630373534322f3230313531312f3630373534322d32303135313132343130353630383039332d3936373031303436332e676966

    只是這例子中用了作者自己封裝的YXEasing類。

    總結

    非線性動畫對于要精益求精交互工程師來說,是一把劍利的刃。放在iOS5時代可能因為設備性能等問題,還是把雙刃劍,但現在來說,已經完全是提升APP動效交互的利器了。

    相關閱讀: 緩動函數速查表

    版權聲明:本文為weixin_34178244原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_34178244/article/details/89444027

    智能推薦

    【Angular】angular-animations 動畫 BrowserAnimationsModule 詳解

    為了弄懂angular的動畫自己也是花了一番功夫,不客觀的說,angular的動畫寫起來是比較復雜的,但又必須掌握。 下面是我結合官方文檔的資料,自己通過實踐寫出來的一篇博客,希望可以幫到有需求的小伙伴,當然,如果文章有地方寫的錯誤,歡迎指正。 好了,廢話不多說,開始正文吧。 1:angular動畫的使用需要先引入一些與動畫有關的函數。 組件里引用:(:暫時先在組件里寫動畫相關的代碼,文末會把它單...

    material—animations簡單操作activity過渡動畫

    Material-Animations gihub下載地址:https://github.com/lgvalle/Material-Animations 總體分四部分,簡單的過渡動畫,分享元素的過渡動畫,通過Transition實現的view動畫,ReveaAimation四種,接下來都以此介紹一下。 簡單過渡動畫 簡單的過渡動畫分三種吧,Slide,Fade,Explode,滑動,漸變,爆炸三種...

    iOS動畫編程-View動畫[ 4 ]高級View Animations

    View組合動畫 前幾節中我們已經學習了基本的View動畫,其實我們已經可以通過這些技術的組合實現非常酷炫的效果了,這節我們不會涉及新的API,一起來學習一下View動畫的組合 背景圖片的漸變效果 背景圖片的漸變效果在很多應用中都會遇到,其實利用前幾節學習到的基本View動畫就可以做到 我們現在希望在這兩個界面間進行切換 由于我們希望能夠柔和地過渡到第二個圖片,如果我們直接替換圖片的話會顯得非常突...

    Android34_Animations使用(二)

      在代碼中使用Animations可以很方便的調試、運行,但是代碼的可重用性差,重復代碼多。同樣可以在xml文件中配置Animations,這樣做可維護性變高了,只不過不容易進行調試。 一、在xml中使用Animations步驟 1.在res文件夾下建立一個anim文件夾; 2.創建xml文件,并首先加入set標簽,更改標簽如下:     &nb...

    QML進階教程:三、動畫分組(Grouped Animations)

    前言: 如果想同時運行幾個動畫并把他們連接起來,或者在一個一個的運行,或者在兩個動畫之間執行一個腳本。動畫分組 提供了很好的幫助,有兩種方法來分組:平行與連續。可以使用SequentialAnimation(連續動畫) 和ParallelAnimation(平行動畫) 來實現它們,它們作為動畫的容器來包含其它的動畫元素。 代碼實例: 運行軌跡:...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡