日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于CAShapeLayer和贝塞尔曲线的圆形进度条动画

發布時間:2025/3/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于CAShapeLayer和贝塞尔曲线的圆形进度条动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

通過CAShapeLayer和貝塞爾曲線搭配的方法,創建的簡單的圓形進度條的教程
先簡單的介紹下CAShapeLayer
1,CAShapeLayer繼承自CALayer,可使用CALayer的所有屬性
2,CAShapeLayer需要和貝塞爾曲線配合使用才有意義。
Shape:形狀
貝塞爾曲線可以為其提供形狀,而單獨使用CAShapeLayer是沒有任何意義的。
3,使用CAShapeLayer與貝塞爾曲線可以實現不在view的DrawRect方法中畫出一些想要的圖形

關于CAShapeLayer和DrawRect的比較
DrawRect:DrawRect屬于CoreGraphic框架,占用CPU,消耗性能大
CAShapeLayer:CAShapeLayer屬于CoreAnimation框架,通過GPU來渲染圖形,節省性能。動畫渲染直接提交給手機GPU,不消耗內存

貝塞爾曲線與CAShapeLayer的關系
1,CAShapeLayer中shape代表形狀的意思,所以需要形狀才能生效
2,貝塞爾曲線可以創建基于矢量的路徑
3,貝塞爾曲線給CAShapeLayer提供路徑,CAShapeLayer在提供的路徑中進行渲染。路徑會閉環,所以繪制出了Shape
4,用于CAShapeLayer的貝塞爾曲線作為Path,其path是一個首尾相接的閉環的曲線,即使該貝塞爾曲線不是一個閉環的曲線

說完了簡介們來看一下如何創建一個簡單的圓形進度條

//創建全局屬性的ShapeLayer

@property(nonatomic, strong) CAShapeLayer *shapeLayer;

- (void)viewDidLoad {

????[superviewDidLoad];

????

????//創建出CAShapeLayer

????self.shapeLayer = [CAShapeLayer layer];

????self.shapeLayer.frame = CGRectMake(0, 0, 200, 200);//設置shapeLayer的尺寸和位置

????self.shapeLayer.position =?self.view.center;

????self.shapeLayer.fillColor = [UIColor clearColor].CGColor;//填充顏色為ClearColor

????

????//設置線條的寬度和顏色

????self.shapeLayer.lineWidth = 1.0f;

????self.shapeLayer.strokeColor = [UIColor redColor].CGColor;

????

????//創建出圓形貝塞爾曲線

????UIBezierPath *circlePath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 200, 200)];

????

????//讓貝塞爾曲線與CAShapeLayer產生聯系

????self.shapeLayer.path = circlePath.CGPath;

????

????//添加并顯示

????[self.view.layer addSublayer:self.shapeLayer];

}

這時候我們運行下能看到會有一個圓

現在我們要用到CAShapeLayer的兩個參數,strokeEnd和strokeStart
Stroke:用筆畫的意思
在這里就是起始筆和結束筆的位置
Stroke為1的話就是一整圈,0.5就是半圈,0.25就是1/4圈。以此類推

如果我們把起點設為0,終點設為0.75

1 2 3 //設置stroke起始點 self.shapeLayer.strokeStart = 0; self.shapeLayer.strokeEnd = 0.75;

看下運行效果

起點和終點我們可以自己控制了,接下來我們在價格定時器,就可以完成我們的圓形進度條了
加個全局變量add,這是我們每次的遞增量

1 2 3 4 @interfaceViewController () { ????doubleadd; }

再寫個定時器

1 2 3 4 5 6 7 add = 0.1;//每次遞增0.1 //用定時器模擬數值輸入的情況 ????_timer = [NSTimerscheduledTimerWithTimeInterval:0.1 ??????????????????????????????????????????????target:self ????????????????????????????????????????????selector:@selector(circleAnimationTypeOne) ????????????????????????????????????????????userInfo:nil ?????????????????????????????????????????????repeats:YES];

定時器每次時間到了執行的函數,這個比較簡單就不解釋了

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 - (void)circleAnimationTypeOne { ????if(self.shapeLayer.strokeEnd > 1 &&?self.shapeLayer.strokeStart < 1) { ????????self.shapeLayer.strokeStart += add; ????}elseif(self.shapeLayer.strokeStart == 0){ ????????self.shapeLayer.strokeEnd += add; ????} ???? ????if(self.shapeLayer.strokeEnd == 0) { ????????self.shapeLayer.strokeStart = 0; ????} ???? ????if(self.shapeLayer.strokeStart ==?self.shapeLayer.strokeEnd) { ????????self.shapeLayer.strokeEnd = 0; ????} }

再來運行下我們來看看效果

?

總結

以上是生活随笔為你收集整理的基于CAShapeLayer和贝塞尔曲线的圆形进度条动画的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。