浅谈贝塞尔曲线以及iOS中粘性动画的实现
关于贝塞尔曲线,网上相关的文章很多,这里我主要想用更简单的方法让大家理解贝塞尔曲线,当然,这仅仅是我个人的理解,如有错误的地方还请大家能够帮忙指出来,这样大家才能一起进步。
贝塞尔曲线,常用到的可分为如下几类,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中粘性动画的实现的更多相关文章
- 谈谈iOS中粘性动画以及果冻效果的实现
在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: https://github.c ...
- 转:谈谈iOS中粘性动画以及果冻效果的实现
在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: 先做个提纲: 第一个分享的主题是 ...
- 转:浅谈CSS在前端优化中一些值得注意的关键点
前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...
- 浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- iOS中的动画
iOS中的动画 Core Animation Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,使用它需要添加QuartzCore .fr ...
- iOS中的动画(转载)
iOS中的动画 最近两天没事在慢慢学习一些动画,好多东西长时间不用都给忘了,找到一篇介绍很详细的文章就粘贴了过来以备复习,原文地址:https://my.oschina.net/aofe/blog/ ...
- 浅谈箭头函数和setTimeout中的this
箭头函数会改变this的指向,这个大家看文档都看到过,可是有没有具体理解呢?我发现自己应该可能大概是......emmmm,然后我整理了一遍,加强一下概念吧顺带再讲一下setTimeout这个函数改写 ...
- 贝塞尔曲线在Unity中的应用
前言:国庆放假后基本整个人的散掉了.加之种种原因,没时间没心情写博客.最近研究了一下3d的一些效果.其中有类似翻书撕纸的操作,可是一个panel怎么由平整的变成弯曲的呢? 两点可以确定一条直线,三点可 ...
随机推荐
- yolo源码解析(2):处理图片
首先安装ffmpeg, 参考https://blog.csdn.net/lwgkzl/article/details/77836207 然后将视频切分为图片, 参考:https://zhuanlan. ...
- nyoj--90--整数划分(母函数)
整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk, 其中n1≥n2≥-≥nk≥1,k≥1. 正整数 ...
- poj--3250--Bad Hair Day(模拟)
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit ...
- POJ 1951 模拟
思路: 坑爹模拟毁我一生 给两组数据: 输入: YOURE TRAVELING THROUGH ANOTHER DIMENSION A DIMENSION NOT OF SIGHT. 输出: YR T ...
- 实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())
关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了. 是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为 ...
- python 3.x 学习笔记10 (析构函数and继承)
1.类变量的用途:大家公用的属性,节省开销(内存) 2.析构函数 在实例释放和销毁的时候执行的,通常用于做一些收尾工作,如关闭一些数据库链接和打开的临时文件 3.私有方法两个下划线开头,声明该方法为私 ...
- 继续ubuntu和遇到的easybcd的坑
找了很多教程,反复斟酌https://www.zhihu.com/question/34611974 个人感觉前方还有大坑无数.unbuntu四个分区系列——65%根目录,25%home目录,交换分区 ...
- sqlserver 恢复模式及避免日志爆满的方法
recovery simple 循环日志,空间自动回收,不可备份日志,恢复时仅能恢复到数据库备份时间点: 用于落地数据或测试环境或OLAP,不推荐用于生产OLTP 有时候distribution过大也 ...
- HDU 1551 Cable master【二分答案】
题意:给出n块木板,它们分别的高度,现在要把它们裁切成k块,问裁切成的最大的高度 二分答案,上限是这n块木板里面的最大值 然后每一个答案去判断一下是否满足能够裁切成k块 #include<ios ...
- lftp简单使用
连接服务器: lftp -e "参数;" "username":"password"@"ip" -p port lftp ...