Oc Snow Animation(下雪动画)~demo
2017-10-31 19:58
190 查看
控制器1: SHContext.h
#ifndef SHContext_h #define SHContext_h /* 该方法负责绘制圆角矩形 x1、y2:是圆角矩形左上角的座标。 width、height:控制圆角举行的宽、高 radius:控制圆角矩形的四个圆角的半径 */ void CGContextAddRoundRect(CGContextRef c, CGFloat x1 , CGFloat y1 , CGFloat width , CGFloat height , CGFloat radius) { // 移动到左上角 CGContextMoveToPoint (c, x1 + radius , y1); // 添加一条连接到右上角的线段 CGContextAddLineToPoint(c , x1 + width - radius, y1); // 添加一段圆弧 CGContextAddArcToPoint(c , x1 + width , y1, x1 + width , y1 + radius, radius); // 添加一条连接到右下角的线段 CGContextAddLineToPoint(c , x1 + width, y1 + height - radius); // 添加一段圆弧 CGContextAddArcToPoint(c , x1 + width, y1 + height , x1 + width - radius , y1 + height , radius); // 添加一条连接到左下角的线段 CGContextAddLineToPoint(c , x1 + radius, y1 + height); // 添加一段圆弧 CGContextAddArcToPoint(c , x1, y1 + height , x1 , y1 + height - radius , radius); // 添加一条连接到左上角的线段 CGContextAddLineToPoint(c , x1 , y1 + radius); // 添加一段圆弧 CGContextAddArcToPoint(c , x1 , y1 , x1 + radius , y1 , radius); } /* 该方法负责绘制多角星。 n:该参数通常应设为奇数,控制绘制N角星。 dx、dy:控制N角星的中心。 size:控制N角星的大小 */ void CGContextAddStar(CGContextRef c , NSInteger n , CGFloat dx , CGFloat dy , NSInteger size) { CGFloat dig = 4 * M_PI / n ; // 移动到指定点 CGContextMoveToPoint(c , dx , dy + size); for(int i = 1 ; i <= n ; i++) { CGFloat x = sin(i * dig); CGFloat y = cos(i * dig); // 绘制从当前点连接到指定点的线条 CGContextAddLineToPoint(c , x * size + dx ,y * size + dy); } } /* 该方法负责绘制花朵。 n:该参数控制花朵的花瓣数。 dx、dy:控制花朵的位置。 size:控制花朵的大小 length:控制花瓣的长度 */ void CGContextAddFlower(CGContextRef c , NSInteger n , CGFloat dx , CGFloat dy , CGFloat size , CGFloat length) { // 移动到指定点 CGContextMoveToPoint(c , dx , dy + size); CGFloat dig = 2 * M_PI / n; // 采用循环添加n段二次曲线路径 for(int i = 1; i < n + 1 ; i++) { // 结算控制点坐标 CGFloat ctrlX = sin((i - 0.5) * dig) * length + dx; CGFloat ctrlY= cos((i - 0.5 ) * dig) * length + dy; // 结算结束点的坐标 CGFloat x = sin(i * dig) * size + dx; CGFloat y =cos(i * dig) * size + dy; // 添加二次曲线路径 CGContextAddQuadCurveToPoint(c, ctrlX , ctrlY , x , y); } } #endif /* SHContext_h */
控制器2:SHSnowView.m
#import "SHSnowView.h" #import "SHContext.h" @implementation SHSnowView // 定义雪花的初始化位置 static CGPoint snowPos[] = { {20, 4}, {50, 4}, {80, 4}, {110, 4}, {140, 4}, {170, 4}, {200, 4}, {230, 4}, {260, 4}, {290, 4} }; // 计算雪花的数量 static NSInteger snowCount = sizeof(snowPos) / sizeof(snowPos[0]); -(id) initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if(self) { // 控制每隔0.2秒执行一次setNeedsDisplay方法刷新自己 [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(setNeedsDisplay) userInfo:nil repeats:YES]; } return self; } - (void)drawRect:(CGRect)rect { CGContextRef ctx = UIGraphicsGetCurrentContext(); // 设置采用白色作为填充色 CGContextSetRGBFillColor(ctx , 1, 1 , 1 , 1); for (int i = 0 ; i < snowCount ; i++ ) { // 保存当前绘图状态 CGContextSaveGState(ctx); // 平移坐标系统 CGContextTranslateCTM(ctx , snowPos[i].x a03e , snowPos[i].y); // 旋转坐标系统 CGContextRotateCTM(ctx , (arc4random() % 6 - 3) * M_PI / 10); // 控制“雪花”下掉 snowPos[i].y += arc4random() % 8; if (snowPos[i].y > 320) { snowPos[i].y = 4; } // 创建、并绘制“雪花” CGContextAddFlower(ctx , 6 , 0 , 0 , 4 , 8); CGContextFillPath(ctx); // 恢复绘图状态 CGContextRestoreGState(ctx); } } @end
相关文章推荐
- iOS SnowAnimation(下雪动画)~demo
- Android动画学习Demo(1) 关于ViewAnimation的用法及总结
- Android Animation 动画Demo
- Android Animation 动画Demo(Frame帧动画)
- android Animation图片渐变动画 Demo
- Android动画学习Demo(1) 关于ViewAnimation的用法及总结
- AlphaAnimation渐变动画Demo
- Oc 动画MermaidSwimming(美人鱼游泳)~demo
- Android 渐变动画(Tween animation)
- Android动画之AnimationListener(六)
- 源码推荐(04.29):iOS动画Demo,HR_W仿QQ页面
- Android上几种Animation和多个动画同时播放以ScaleAnimation应用详解
- Unity3d之Animation(动画系统)
- iOS 核心动画之CAKeyFrameAnimation
- Unity3d之Animation(动画系统)
- iOS开发之CAAnimation核心动画
- Android学习笔记_39_tween动画的实现(Animation和Frame)
- Swift基础之Animation动画研究
- OC UINavigationController push pop自定义动画
- 详细讲解Android中的动画Animation(依据Android源码目录结构讲解)