美文网首页iOS动画动画
圆球沿着椭圆轨迹做动画

圆球沿着椭圆轨迹做动画

作者: 秋雨W | 来源:发表于2016-07-19 17:09 被阅读849次

前言:最近公司项目有个需求,需要实现让一个view沿着椭圆轨迹做动画,效果实现后,就自己封装做了一个小demo,使用更方便。先看效果:

椭圆.gif

效果图中的白色椭圆轨迹线其实是用贝塞尔曲线画出来的,为了清晰的看出来运动的轨迹。其实项目中是不显示轨迹线的,也就是小球是悬空运动的。若不需要删除掉即可。

**
实现步骤:
**

1.首先设定关键帧动画CAKeyframeAnimation的一些属性,比如运动时间和重复次数和calculationMode模式,我们选择kCAAnimationPaced 使得动画均匀进行。

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

2.设定好关键帧动画的path,即一个椭圆形的路径。需要使用CGPathAddArcCGPathAddArc经常用于画正圆,比如下面就是一个正圆,各个参数的意义:

 //160,200为圆心,100为半径 (startAngle,endAngle)为起始角度和结束角度,1为顺时针,0 为逆时针
 CGPathAddArc(curvedPath, NULL, 160,200, 100, startAngle, endAngle, 0);

需要注意的是由于iOS中的坐标体系是和Quartz坐标体系中Y轴相反的,所以iOS UIView在做Quartz绘图时,Y轴已经做了Scale为-1的转换,因此造成CGPathAddArc函数最后一个是否是顺时针的参数结果正好是相反的,也就是说如果设置最后的参数为YES,根据参数定义应该是顺时针的,但实际绘图结果会是逆时针的!

我们需要画的是椭圆啊,别急,接下来稍作更改即可。正圆第二个参数默认为NULL,我们要改成椭圆,

    //短半轴和长半轴的比例
    float radiuscale = 0.5;
    //椭圆顶点的坐标值
    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.贝塞尔画椭圆
如果是整个椭圆的话,只需要设定好理想中的椭圆的外切圆即可。

    //整个椭圆
    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);

**总结: 希望本文能对你有帮助。如果你有更好的想法,欢迎和我交流! **
demo地址:https://github.com/xiaochenyi/CircleAnimateDemo

相关文章

  • 圆球沿着椭圆轨迹做动画

    前言:最近公司项目有个需求,需要实现让一个view沿着椭圆轨迹做动画,效果实现后,就自己封装做了一个小demo,使...

  • View动画ii(沿椭圆轨迹运动)

  • svg实现沿椭圆轨迹旋转动画

    需求1.实现元素沿椭圆轨迹均匀旋转2.鼠标点击事件、移入暂停运动3.元素由远到近逐渐增大 旋转动画的实现思路:1....

  • 第七章 svg动画

    水平变化的动画 svg轨迹动画 让矩形沿着弧线运动---画出矩形和弧线 svg力导向图 突然感觉回到了高中时代 最...

  • iOS-星球沿椭圆轨迹旋转

    先看效果: 什么?太模糊!来一张高清无码 背景旋转 星星的闪烁 轨迹动画 绘制椭圆 下面是demo地址链接: ht...

  • 正在加载之8个圆球动画旋转

    显示8个圆球围成一个圆形的动画加载效果,类似一个实心球带着拖尾旋转只需要绘制8个实心圆球外加8个无限动画触发圆球的...

  • 沿着岁月轨迹前行

    家 一对相亲相爱的男女 共撑一方天空 筑一处暖巢 摆几样物件儿 那就是家 一个 可以哭 可以笑 可以随心所欲 无...

  • css3实现沿椭圆轨迹旋转动画

    需求1.实现元素沿椭圆轨迹均匀旋转2.鼠标点击事件、移入暂停运动3.元素由远到近逐渐增大 网上关于css3实现旋转...

  • iOS 圆球加载动画解析

    一、显示效果 二、原理分析 1、拆解动画 从效果图来看,动画可拆解成两部分:放大动画、位移动画放大动画 比较简单,...

  • 轨迹是圆,是椭圆

    哪能一辈子就认准一个人了呢? 以前听到这样描述一个人, 会觉得他很傻, 现在认为他一定很幸福, 有个中心, 可以在...

网友评论

  • 倪偲_:我是航天专业的,似乎你这个沿着椭圆轨道是匀速运行的?可是春分点和秋分点附近是有快慢区别的啊

本文标题:圆球沿着椭圆轨迹做动画

本文链接:https://www.haomeiwen.com/subject/hxgmjttx.html