圓球沿著橢圓軌跡做動畫

前言:最近公司項目有個需求,需要實現(xiàn)讓一個view沿著橢圓軌跡做動畫,效果實現(xiàn)后,就自己封裝做了一個小demo,使用更方便。先看效果:

橢圓.gif

效果圖中的白色橢圓軌跡線其實是用貝塞爾曲線畫出來的,為了清晰的看出來運動的軌跡。其實項目中是不顯示軌跡線的,也就是小球是懸空運動的。若不需要刪除掉即可。

**
實現(xiàn)步驟:
**

1.首先設(shè)定關(guān)鍵幀動畫CAKeyframeAnimation的一些屬性,比如運動時間和重復(fù)次數(shù)和calculationMode模式,我們選擇kCAAnimationPaced 使得動畫均勻進行。

    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    pathAnimation.calculationMode = kCAAnimationPaced;
    pathAnimation.fillMode = kCAFillModeForwards;
    pathAnimation.removedOnCompletion = NO;
    pathAnimation.duration = 5.0;
    pathAnimation.repeatCount = 2;

2.設(shè)定好關(guān)鍵幀動畫的path,即一個橢圓形的路徑。需要使用CGPathAddArcCGPathAddArc經(jīng)常用于畫正圓,比如下面就是一個正圓,各個參數(shù)的意義:

 //160,200為圓心,100為半徑 (startAngle,endAngle)為起始角度和結(jié)束角度,1為順時針,0 為逆時針
 CGPathAddArc(curvedPath, NULL, 160,200, 100, startAngle, endAngle, 0);

需要注意的是由于iOS中的坐標(biāo)體系是和Quartz坐標(biāo)體系中Y軸相反的,所以iOS UIView在做Quartz繪圖時,Y軸已經(jīng)做了Scale為-1的轉(zhuǎn)換,因此造成CGPathAddArc函數(shù)最后一個是否是順時針的參數(shù)結(jié)果正好是相反的,也就是說如果設(shè)置最后的參數(shù)為YES,根據(jù)參數(shù)定義應(yīng)該是順時針的,但實際繪圖結(jié)果會是逆時針的!

我們需要畫的是橢圓啊,別急,接下來稍作更改即可。正圓第二個參數(shù)默認為NULL,我們要改成橢圓,

    //短半軸和長半軸的比例
    float radiuscale = 0.5;
    //橢圓頂點的坐標(biāo)值
    CGFloat origin_x = self.frame.size.width/2;
    CGFloat origin_y = self.frame.size.height/2;
    //長半軸的長
    CGFloat radiusX = 100;
    
    CGMutablePathRef curvedPath = CGPathCreateMutable();
    CGAffineTransform t2 = CGAffineTransformConcat(CGAffineTransformConcat(
                                                                           CGAffineTransformMakeTranslation(-origin_x, -origin_y),
                                                                           CGAffineTransformMakeScale(1, radiuscale)),
                                                   CGAffineTransformMakeTranslation(origin_x, origin_y));
    CGPathAddArc(curvedPath, &t2, origin_x, origin_y, radiusX,startAngle,endAngle, 1);
    pathAnimation.path = curvedPath;
    CGPathRelease(curvedPath);

好了,至此,動畫的軌跡和屬性都寫好了。添加到view上就ok了。

3.貝塞爾畫橢圓
如果是整個橢圓的話,只需要設(shè)定好理想中的橢圓的外切圓即可。

    //整個橢圓
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    UIBezierPath *arc = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(origin_x-100, origin_y-50, 200, 100)];
    [[UIColor whiteColor] setStroke];
    [arc stroke];
    CGContextRestoreGState(context);

**總結(jié): 希望本文能對你有幫助。如果你有更好的想法,歡迎和我交流! **
demo地址:https://github.com/xiaochenyi/CircleAnimateDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,272評論 5 13
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,698評論 6 30
  • 概覽 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺iOS動畫全貌。在這里你...
    被吹落的風(fēng)閱讀 1,709評論 1 2
  • 每天的閱讀已成習(xí)慣,最近雨比較多,晚上吃完飯也不能出去散步,一家人就會坐在兒子的活動區(qū)閱讀,老公陪兒子讀繪...
    小玲兒_閱讀 177評論 2 8
  • 清晨打開手機,看到上面日期:8月23日。 突然意識到今天是我來簡書寫作整整一年的時間。 此時想起了慕芝妹妹的約稿:...
    RainbowPeng閱讀 4,269評論 127 161

友情鏈接更多精彩內(nèi)容