关于贝塞尔曲线,网上相关的文章很多,这里我主要想用更简单的方法让大家理解贝塞尔曲线,当然,这仅仅是我个人的理解,如有错误的地方还请大家能够帮忙指出来,这样大家才能一起进步。

贝塞尔曲线,常用到的可分为如下几类,1阶曲线,2阶曲线(二次函数算是一种),3阶曲线,高阶曲线。

通用的方程为

这是由p0~pn这n+1个点组成的高阶方程。

但是光看这个方程的话或许大家会觉得不太理解,这东西到底能做什么?

我先逐渐的从1阶曲线讲起吧:

这里借鉴下这篇文章的几幅图片来描绘一下下列几个情况:

1阶曲线,是由两个端点组成,无控制点,此时贝塞尔曲线的起点就从端点开始出发,走到另一个端点,而此区间没有控制点,所以描绘出来的是一条直线。

2阶曲线,则是由两个端点加上一个控制点组成,此时,将两个端点分别与控制点连线所产生的就有两条线段,而分别从两条线段上的任意两点又能构成一条新的直线,不过此时我们不会取任意两点,在上图中是p0-p1形成的折线以及p1-p2形成的折线,如此一来,由p0-p1上的点以及p1-p2上的点同时出发的话这两条线段上的点会同时动,由这两个动点所产生的直线是一条会变化的直线,而这条直线也正是贝塞尔曲线的点在描绘贝塞尔曲线的时候所要经过的点。正因为直线式不断变化的,所以它描绘出来的线就变成了一条平滑的曲线。

3阶曲线以及高阶曲线,同2阶曲线一样,2个或2个以上的控制点所构成的所有折线段的点分别出发,然后在将这些动点所形成的直线再分解成n-1个动的折线,再将折线上的点再重新链接,如此递归,最终转换成1阶,如此一来可描绘出n阶贝塞尔曲线。

好了这里把大家给说晕了,先来看看实际效果吧

这是我最近做的一个开源,是仿照美团外卖来做的一个下拉动画,可以看到这个粘性动画就是当我们滑动tableview从而产生的一个动画,这里我谈一谈我的实现思路吧,你所看到的这个粘性红色视图其实是用贝塞尔曲线描绘出来的闭合图形,我们可以很直观的可以看出它其实是一个二阶贝塞尔曲线,而且控制点为整个屏幕的中心,通过获取scrollview的滑动偏移量来绘制控制点的坐标。

下面来看一下代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

CGFloat offsetY = scrollView.contentOffset.y+64;

refreshHeadView.offsetY = offsetY;

//异步执行,setNeedsDisplay会调用自动调用drawRect方法

[refreshHeadView setNeedsDisplay];

}

我们通过scrollview的代理方法获取到偏移量存了起来,然后在UIView中进行绘制,setNeedsDisplay这个方法会使得UIView重绘,

#pragma mark 画图

- (void)drawRect:(CGRect)rect {

// 创建一个贝塞尔曲线句柄

UIBezierPath *path = [UIBezierPath bezierPath];

// 初始化该path到一个初始点

[path moveToPoint:CGPointMake(0, 0)];

//    // 添加一条直线

//    [path addLineToPoint:CGPointMake(0, 0)];

// 画二元曲线,一般和moveToPoint配合使用

[path addQuadCurveToPoint:CGPointMake(self.frame.size.width, 0) controlPoint:CGPointMake(self.frame.size.width/2,- _offsetY*1.2)];

// 关闭该path

[path closePath];

// 创建描边(Quartz)上下文

CGContextRef context = UIGraphicsGetCurrentContext();

// 将此path添加到Quartz上下文中

CGContextAddPath(context, path.CGPath);

// 设置本身颜色

[[UIColor redColor] set];

// 设置填充的路径

CGContextFillPath(context);

}

这样当我滑动的时候,控制点的坐标也在改变,且在屏幕中心向下移动,就构成了我们熟知的二次曲线。下面附上GitHub地址

浅谈贝塞尔曲线以及iOS中粘性动画的实现的更多相关文章

  1. 谈谈iOS中粘性动画以及果冻效果的实现

    在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: https://github.c ...

  2. 转:谈谈iOS中粘性动画以及果冻效果的实现

    在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: 先做个提纲: 第一个分享的主题是 ...

  3. 转:浅谈CSS在前端优化中一些值得注意的关键点

    前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...

  4. 浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  5. 【WebApi系列】浅谈HTTP在WebApi开发中的运用

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...

  6. iOS中的动画

    iOS中的动画 Core Animation Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,使用它需要添加QuartzCore .fr ...

  7. iOS中的动画(转载)

    iOS中的动画  最近两天没事在慢慢学习一些动画,好多东西长时间不用都给忘了,找到一篇介绍很详细的文章就粘贴了过来以备复习,原文地址:https://my.oschina.net/aofe/blog/ ...

  8. 浅谈箭头函数和setTimeout中的this

    箭头函数会改变this的指向,这个大家看文档都看到过,可是有没有具体理解呢?我发现自己应该可能大概是......emmmm,然后我整理了一遍,加强一下概念吧顺带再讲一下setTimeout这个函数改写 ...

  9. 贝塞尔曲线在Unity中的应用

    前言:国庆放假后基本整个人的散掉了.加之种种原因,没时间没心情写博客.最近研究了一下3d的一些效果.其中有类似翻书撕纸的操作,可是一个panel怎么由平整的变成弯曲的呢? 两点可以确定一条直线,三点可 ...

随机推荐

  1. Android用canvas画哆啦A梦

    先上图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/diss ...

  2. JavaSE入门学习24:Java面向对象补充

    一Java中的Object类 Object类是全部Java类的父类.假设一个类没有使用extendskeyword明白标识继承另外一个类,那么这个类默认 继承Object类. public class ...

  3. oracle 时间戳TIMESTAMP

    //数据库 UPDATETIMESTAMP TIMESTAMP(6) //dto /** 更新时间戳 **/ private String updatetimestamp; //dao //插入操作 ...

  4. s3c2440的IIC控制

    在tq2440和mini2440上都连接着EEPROM 它们作用也不过測试I2C总线能否用. 当中在mini2440上EEPROM型号是 AT24C08,在tq2440上这个型号是 AT24C02A. ...

  5. windows+ubuntu双系统,在windows中访问ubuntu文件

    今天被告知ubuntu磁盘空间不足,百度得知可以通过autoremove命令清理,然而,,再也进不去ubuntu系统了,具体表现为第一次选择ubuntu之后一直是空白紫屏,如果强制关机再开机后选择ub ...

  6. bzoj2150: 部落战争(匈牙利)

    2150: 部落战争 题目:传送门 题解: 辣鸡数据..毁我AC率 先说做法,很容易就可以看出是二分图匹配的最小路径覆盖(可能是之前不久刚做过类似的题) 一开始还傻逼逼的去直接连边然后准备跑floyd ...

  7. 性能监控之监控SQL语句

    分析表 analyze table tablename compute statistics for all indexes; analyze table tablename compute stat ...

  8. Linux基础02

    ** Linux基本操作常用命令(二) ** 用户名与主机名 当你进入Linux终端时,你会看到如下样式的图片:     其中[z@z01]方括号内的z表示当前系统登录操作的用户名,@后的z01表示当 ...

  9. Python3基础笔记---模块

    参考博客:Py西游攻关之模块 模块的概念: 我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为 ...

  10. [AHOI2013]差异 后缀自动机_Parent树

    题中要求: $\sum_{1\leqslant i < j \leq n } Len(T_{i}) +Len(T_{j})-2LCP(T_{i},T_{j})$ 公式左边的部分很好求,是一个常量 ...