太阳升起并下落的小动画-SWIFT
一个小小的动画,太阳公公上山又下山。先上效果图。
用 lipecap 录的gif效果有点卡顿。好吧,说下如何实现的。
首先在一个大圆内先计算出内切九边形各个顶点的位置,接着连接相应的顶点变成一个九角星太阳的九条光芒,然后在九角星的中心画一个圈形的Layer,这样就大致画好了大阳的形状。
新建一个叫SunView的文件继承自UIView,然后在init方法内添加一个addSunLayer()的方法。并在里面添加以下方内容
class SunView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
addSunLayer()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
在addSunLayer()方法内添加绘制九角星的代码:
- let ninePolyganPath:UIBezierPath = UIBezierPath()
- //大圆的半径
- let radius:CGFloat = self.frame.size.width / 2
- //九角星各个顶点的位置
- var anglePoints:Dictionary<String,CGPoint> = Dictionary<String,CGPoint>()
- //第一个顶点的位置,最右边中间那个点
- let firstPoint:CGPoint = CGPoint(x: bounds.width, y: bounds.width / 2)
- anglePoints["0"] = firstPoint
- ninePolyganPath.moveToPoint(firstPoint)
- for i in 1..<9 {
- //将圆分成9份,每一份的大小为40度
- let angle = Double(i) * 40.0
- //算出相应角度的三角函数值
- let rateSin:CGFloat = sin(CGFloat(angle / 180 * M_PI))
- let rateCos:CGFloat = cos(CGFloat(angle / 180 * M_PI))
- let x:CGFloat = radius * rateCos + radius
- let y:CGFloat = radius * rateSin + radius
- anglePoints[String(i)] = CGPoint(x: x, y: y)
- }
- //连接相应的九个点,使之成为九角星
- ninePolyganPath.addLineToPoint(anglePoints["4"]!)
- ninePolyganPath.addLineToPoint(anglePoints["8"]!)
- ninePolyganPath.addLineToPoint(anglePoints["3"]!) ninePolyganPath.addLineToPoint(anglePoints["7"]!) ninePolyganPath.addLineToPoint(anglePoints["2"]!)
- ninePolyganPath.addLineToPoint(anglePoints["6"]!)
- ninePolyganPath.addLineToPoint(anglePoints["1"]!)
- ninePolyganPath.addLineToPoint(anglePoints["5"]!)
- ninePolyganPath.closePath()
- let ninePolyganLayer:CAShapeLayer = CAShapeLayer()
- ninePolyganLayer.fillColor = UIColor.yellowColor().CGColor
- ninePolyganLayer.strokeColor = UIColor.yellowColor().CGColor
- ninePolyganLayer.lineWidth = 5
- ninePolyganLayer.path = ninePolyganPath.CGPath
self.layer.addSublayer(ninePolyganLayer)
在ViewContoller文件内添加以下代码:
let sunView = SunView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
self.view.addSubview(sunView)
此时九角星就做好了,运行的效果如下:
接着要在九角星的中星心位置添加一个圆,做为太阳中心。添加一个计算属性,一个钜形的内切圆路径。
- var sunCirclePath:UIBezierPath {
- return UIBezierPath(ovalInRect: CGRect(x: self.frame.size.width * 0.3 / 2, y: self.frame.size.height * 0.3 / 2, width: self.frame.size.width - self.frame.size.width * 0.3, height: self.frame.size.height - self.frame.size.height * 0.3))
- }
接着在addSunLayer方法内添加以下内容:
- let sunLayer:CAShapeLayer = CAShapeLayer()
- sunLayer.path = sunCirclePath.CGPath
- sunLayer.lineWidth = 5
- sunLayer.fillColor = UIColor.yellowColor().CGColor
- sunLayer.strokeColor = UIColor.colorWithHexString("#eecc00").CGColor
- self.layer.addSublayer(sunLayer)
- //让太阳转动起来
let animation:CABasicAnimation = CABasicAnimation(keyPath: "transform.rotation")
animation.fromValue = 0.0
animation.toValue = 2 * M_PI
animation.duration = 5
animation.repeatCount = HUGE
layer.addAnimation(animation, forKey: nil)
并将上面ninePolyganLayer添加到图层的代码做如下修改。
self.layer.insertSublayer(ninePolyganLayer, below: sunLayer)
//self.layer.addSublayer(ninePolyganLayer)
此时运行效果如下:
最后就是让sunView按着指定的路径运行就可以了。回到ViewController文件内,添加以下计算路径属性,画出一条弧形路径,然后让太阳按着这个路径移动。
- var sunrisePath:UIBezierPath {
- let path:UIBezierPath = UIBezierPath()
- path.moveToPoint(CGPoint(x: 0, y: 160))
- path.addQuadCurveToPoint(CGPoint(x: self.view.frame.size.width, y: 160), controlPoint: CGPoint(x: self.view.frame.size.width / 2, y: 60))
- //path.closePath() //这个不能用,
- return path
- }
添加以下动画代码
- let sunriseAnimation:CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "position")
- sunriseAnimation.path = sunrisePath.CGPath
- sunriseAnimation.duration = 3
sunriseAnimation.calculationMode = kCAAnimationPaced- sunriseAnimation.fillMode = kCAFillModeForwards
- sunriseAnimation.repeatCount = HUGE
- sunriseAnimation.removedOnCompletion = false
- sunView.layer.addAnimation(sunriseAnimation, forKey: nil)
这样就完成了。以上仅供参考,还请大家多提意见。
太阳升起并下落的小动画-SWIFT的更多相关文章
- CSS3-实现单选框radio的小动画
在微信上看到一个教程文,觉得制作的小动画还是很有意思的,自己也试验了一下.一开始动画怎么都不执行(我用的HB),因为内置浏览器对css3的不兼容.加上各种浏览器前缀后就好了.但是旋转那个效果,在HB里 ...
- TabbarItem超炫小动画
本文转载自 不灭的小灯灯 的博客 Tabbar点击时候超炫小动画 感谢这位大神的分享! 对UITabBarController上TabBar按钮动画详细介绍-->>保证你有意外收获,如有 ...
- 如何制作网页小动画?——gif or png
一.场景与动画 为了拉动网站氛围,或者吸引用户浏览焦点,需要使用一些小动画.这种动画不是(gif)单纯的重复,而是需要需要一些控制和交互,比如在动画完成后打开一个对话框.动画有几个基本要素(时间控制, ...
- 利用jQuery实现用户名片小动画
我爱撸码,撸码使我感到快乐!大家好,我是Counter.下面给大家介绍利用jQuery实现的小动画,非常的简便,如果有原生js操作的话,那么就不止这么多行了.至于CSS,个人觉得,这边CSS布局也蛮重 ...
- Canvas 图片绕边旋转的小动画
/** * 图片绕边旋转的小动画 */ function initDemo10() { var canvas = document.getElementById("demo10") ...
- 利用@keyframe及animation做一个页面Loading时的小动画
前言 利用@keyframe规则和animation常用属性做一个页面Loading时的小动画. 1 @keyframe规则简介 @keyframes定义关键帧,即动画每一帧执行什么. 要使用关键帧 ...
- jquery实现一些小动画二
jquery实现一些小动画二 jquery实现拖拽功能 <!DOCTYPE html> <html lang="en"> <head> < ...
- jquery实现一些小动画一
jquery实现小动画 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- CSS3——制作人物走路的小动画
一个很简单的小动画,但是还挺有意思的,就是找这种图片很麻烦,我这里把我找的一张图片贴上来,这张图片是我在网上找的,又改了背景色和大小. <!DOCTYPE html> <html l ...
随机推荐
- 用PhpStorm IDE创建GG App Engine PHP应用教程
在上一篇教程里我们已经介绍了如何为PhpStorm搭建软件环境,那么今天就该是正式的开始创建App了: 3.创建首个Google App Engine PHP Application 现在我们就可以开 ...
- java实验一 20135104刘帅
实验报告 一.实验目的与要求: 实验目的: 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 实验要求: 1.没有Linux基础的同学建议先学习 ...
- 1.1 Activity
1.概念 Application:由多个相关的松散的与用户进行交互Activity组成,通常被打包成apk后缀文件中: Activity:就是被用来进行与用户交互和用来与android内部特性交互的组 ...
- Android--Notification
1.通知(Notification)是应用程序没有运行在前台时可以向用户发出一些提示消息的功能,发出通知后,手机状态栏会显示通知,用户可以通过下拉状态栏来查看和操作通知: 2.Notification ...
- Week1 Java 基础知识
JDK=JRE+Tools JRE=JVM+API 封装:1.模块化:将属性和行为封装在类中,程序定义很多类:2.信息隐蔽:将类的细节部分隐藏起来,用户只通过受保护的接口访问某个类. 继承:父类和 ...
- 2014 年 20 款最好的 CSS 工具
说到 WEB 设计,不得不介绍介绍 CSS 工具,CSS 工具在这里面扮演很重要的角色,可以简化无数开发者和设计师的工作,写出更好的 CSS 代码. 而网上有非常多的 CSS 工具,帮助设计师和开发者 ...
- html中a标签href属性的一个坑
由于公司需要,小菜最近在搞app web开发,目前只有ios和android版本,虽然仅此两个版本,但是依然要考虑浏览器兼容性问题,因为android和ios默认浏览器内核是不一样的. 先说说兼容性问 ...
- Java并行程序设计模式小结
这里总结几种常用的并行程序设计方法,其中部分文字源自<Java程序性能优化>一书中,还有部分文字属于个人总结,如有不对,请大家指出讨论. Future模式 一句话,将客户端请求的处理过程从 ...
- Visual Studio 发布新版API智能提示
Visual Studio 新版API智能提示两周前发布.有了它,你可以在调用API的同时,方便了解到API的相关示例代码.这大大地有助于开发人员学习和使用API. 安装方法如下: 1. 打开Visu ...
- 如何设置iframe高度自适应,在跨域的情况下能做到吗?
在页面上使用iframe来动态加载页面内容是网页开发中比较常见的方法.在父页面中给定一个不带滚动条的iframe,然后对属性src指定一个可加载的页面,这样当父页面被访问的时候,子页面可以被自动加载. ...