• <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按鈕動畫

    最近Github有一個上很火的開源動畫集叫Animations

    我也很喜歡做動畫動效,特來學習觀摩。因為動效的特殊性,很多情況下這個項目里的動效不能直接Copy到我們現有的項目中直接使用,所以搞清楚她們的實現原理就很有必要了。建議配合源碼學習。

    POP按鈕動畫

    沒用過的POP的請移步Facebook Pop 使用指南

    效果如下
    687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3630373534322f3230313531312f3630373534322d32303135313131363230323930373433362d3939323738383338392e676966

    思路 整體效果是用三個CAShapeLayer和一個UILabel組合實現的。CAShapeLayer負責繪制兩個圓的邊和一個實心圓。動畫用POP的POPBasicAnimationPOPSpringAnimation

    你的肉眼能看出哪里用得哪種動畫么?實心圓的尺寸變化、和空心圓的繪制進度是POPBasicAnimation實現的,基本是一個線性動畫,勻速。實心圓的顏色改變用的是POPSpringAnimation彈簧動畫。

    關于CAShapeLayer

    CAShapeLayer是一中特殊的CALayer用于繪制圖形,可以理解成是CoreGraphic的一種對象化封裝。一個CAShapeLayer可以繪制一個簡單圖形。例如例子里的圓

        UIBezierPath *path  = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.lineWidth + self.radius, self.lineWidth + self.radius)
                                                             radius:self.radius + self.lineWidth / 2.f
                                                         startAngle:self.startAngle
                                                           endAngle:self.endAngle
                                                          clockwise:self.clockWise];
        
        shapeLayer.path = path.CGPath;

    bezierPathWithArcCenter這個方法中傳入一系列參數,繪制了一條貝塞爾(bezier)曲線,參數分別是中心點、半徑、開始角度、終止角度,是否閉環。

    POP文字動畫

    POP實現的文字動畫,例子里用的同樣是POPBasicAnimation,所以也是線性變化的。

    - (void)pop_animationDidApply:(POPAnimation *)anim {
    
        NSLog(@"pop_animationDidApply %@", anim);
        
        NSValue *toValue = (NSValue *)[anim valueForKeyPath:@"currentValue"];
        CGSize size      = [toValue CGSizeValue];
        
        [CATransaction setDisableActions:YES];
        CGFloat percent         = (size.height - _math.b) / _math.k;
        _circleShape1.strokeEnd = percent;
        _circleShape2.strokeEnd = percent;
        [CATransaction setDisableActions:NO];
        
        UIColor *color       = [UIColor colorWithRed:percent green:percent blue:percent alpha:1.f];
        double showValue     = fabs(percent * 100);
        self.label.text      = [NSString stringWithFormat:@"%.f%%", showValue];
        self.label.textColor = color;
        
        _blurImageView.alpha = 1 - percent;
    }

    解釋,這個POP動畫的分幀回調,回調中用

       NSValue *toValue = (NSValue *)[anim valueForKeyPath:@"currentValue"];

    取得當前動畫的值,這個動畫實際只是改變了實心圓的尺寸。然后開發者通過當前尺寸計算出動畫的進度

       CGFloat percent         = (size.height - _math.b) / _math.k;

    CATransaction動畫開關,禁用了兩個外邊圓的strokeEnd 隱式動畫。

     [CATransaction setDisableActions:YES]; 

    如果你不明白CALayer的顯式動畫和隱式動畫的區別,請仿照CALayer的隱式動畫和顯式動畫寫一個Demo對比一下。有更多問題可以在下面留言。

    響應鏈

    Target模式,很容易理解。

       // 按住按鈕后沒有松手的動畫
        [_button addTarget:self action:@selector(scaleToSmall) forControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter];
        
        // 按住按鈕松手后的動畫
        [_button addTarget:self action:@selector(scaleAnimations) forControlEvents:UIControlEventTouchUpInside];
        
        // 按住按鈕后拖拽出去的動畫
        [_button addTarget:self action:@selector(scaleToDefault) forControlEvents:UIControlEventTouchDragExit];

    高斯模糊

    高斯模糊(blur)的實現有很多方式,這個源碼里使用的UIImage+ImageEffects是一個 UIImage的擴展。

    動畫效果通過用blur層覆蓋在普通層上,通過修改blur層alpha值實現。

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

    智能推薦

    iOS開發 | 動畫之分解/重組動效

    效果大致如上: 示例的Git地址:https://github.com/Goddreamwt/iOSAnimationSample 最近項目中有需要UIView的分解重組動畫,網上找了好久,就找到一篇介紹相關效果的文檔:重組/分解動畫 UIView Refactor/Destruct Animation - 簡書 參照作者介紹的gitHub介紹,大致實現了項目中的需求,先分享一下。 原gitHub...

    POP的Stroke動畫

    POP的Stroke動畫   效果 源碼 https://github.com/YouXianMing/Animations 細節  ...

    Android學習(16)Animations_動畫

    Android學習(16)Animations_動畫 什么是Animations: Animations提供了一系列的動畫效果,這些效果可以作用于大多數的控件之上 Animations分為兩大類: Tweened Animations:該類提供了旋轉、移動、縮放、淡入淡出的動畫效果 Frame-by-Frame Animations:該類可以創建一個Drawable序列,這些Drawable中的圖...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

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