順時針 逆時針兩種方式減小的倒計時動畫

2021-08-09 20:09:50 字數 3124 閱讀 6968

//順時針畫矩形

_rectshapelayer = [cashapelayer layer];

_rectshapelayer.strokestart = 0.0f;

_rectshapelayer.strokeend = 1.0f;

uibezierpath *path = [uibezierpath bezierpathwithrect:self.bounds];

_rectshapelayer.path = path.cgpath

; _rectshapelayer.fillcolor = [uicolor clearcolor].cgcolor

; _rectshapelayer.linewidth = 2.0f;

_rectshapelayer.strokecolor = [uicolor redcolor].cgcolor

; [self.layer addsublayer:_rectshapelayer];

//畫圓

_circlelayer = [cashapelayer layer];

_circlelayer.strokestart = 0.0f;

_circlelayer.strokeend = 1.0f;

uibezierpath *path = [uibezierpath bezierpathwitharccenter:cgpointmake(self.frame

.size

.width/2, self.frame

.size

.height/2) radius:self.frame

.size

.width / 2 startangle:0 endangle:2*m_pi clockwise:_closewire];

_circlelayer.path = path.cgpath

; _circlelayer.fillcolor = [uicolor clearcolor].cgcolor

; _circlelayer.linewidth = 2.0f;

_circlelayer.strokecolor = [uicolor redcolor].cgcolor

; [self.layer addsublayer:_circlelayer];

cashapelayer能夠做的東西有很多,比calayer要豐富些。

cashapelayer其實用來畫弧形是比較好用的,比用cgcontextref去畫要簡單明瞭一些。

實現動畫的部分我使用cabasicanimation來實現的,因為其屬性比較簡單實用,然後參考了一些大神的部落格。

//矩形的動畫

cabasicanimation *basicanimation = [cabasicanimation animationwithkeypath:_closewire?kclockwiserectanimationkey:kanticlockwiserectanimationkey];

basicanimation.fromvalue = @(0.0);

basicanimation.tovalue = _closewire?@(1.0):@(4.0);

basicanimation.duration = _duration;

basicanimation.fillmode = kcafillmodeforwards;

basicanimation.removedoncompletion = yes;

basicanimation.delegate = self;

if (_closewire) [_rectshapelayer addanimation:basicanimation forkey:nil];

else [self.rectlayer addanimation:basicanimation forkey:nil];

//圓的動畫

cabasicanimation *basicanimation = [cabasicanimation animationwithkeypath:@"strokestart"];

basicanimation.fromvalue = @(0.0);

basicanimation.tovalue = @(1.0);

basicanimation.duration = _duration;

basicanimation.fillmode = kcafillmodeforwards;

basicanimation.removedoncompletion = yes;

basicanimation.delegate = self;

[_circlelayer addanimation:basicanimation forkey:nil];

由於順時針和逆時針的關係,矩形用cashapelayer來繪製的時候只能順時針減小,所以在逆時針的時候我用了drawincontext方法去繪製,而圓則簡單許多,在uibezierpath的類方法中有畫圓的詳細設定,順時針和逆時針都能很方便的設定。

矩形逆時針減小的繪製:

uibezierpath *path = [uibezierpath bezierpath];

//第一段

if (self.progress >= 0 && self.progress

<= 1)

//第二段

if (self.progress >= 1 && self.progress

<= 2)

//第三段

if (self.progress >= 2 && self.progress

<= 3)

//第四段

if (self.progress >= 3 && self.progress

<= 4)

cgcontextaddpath(context, path.cgpath);

cgcontextsetstrokecolorwithcolor(context, [uicolor redcolor].cgcolor);

cgcontextsetlinewidth(context, 2.0);

cgcontextstrokepath(context);

計算兩個向量的夾角(分逆時針與順時針)

兩個向量,求解乙個向量旋轉到另乙個向量的角度,逆時針為正,順時針為負。兩向量的夾角,角度帶正負號 def calangle v1,v2 v1旋轉到v2,逆時針為正,順時針為負 2個向量模的乘積 thenorm np.linalg.norm v1 np.linalg.norm v2 叉乘 rho np...

在操場跑步,逆時針比順時針更快的原因

最近在操場跑步時,嘗試了逆著 方向跑步 通常人習慣在操場逆時針跑步,自己獨自順時針跑 自己跑步過程中使用跑步手錶記錄跑步距離和心率,自己速度並沒有特別的變化的情況下,實際結果是跑步每公里用時更長了。關於這個時間變長的原因,本篇說說自己的兩個解釋。原因一,運動本身帶來的逆向阻力。首先,生活常識告訴我們...

怎樣對平面中的點進行順時針或者逆時針排序

在二維空間中對點進行排序,可能會遇見其中有些點是垂直於x軸 或者垂直於y軸 這樣就可能對於用反正切的值去比較產生考慮不完全的影響導致結果錯誤。這樣我提出乙個好的解決方案就是在這些點中找乙個新的點來作為新的座標點在進行用反正切的值判斷,相當於把說有的點進行了乙個座標軸的旋轉 如果不是凸多邊形,存在旋轉...