来斯凯网络已经一个礼拜了,怎么说呢!以为上市公司会有很多同事一起弄iOS,结果让我很失望,这里iOS开发也是刚起步不久。 都需要自己去弄的。比起新中大唯一的的好处就是给我配置了两台手提:一台时苹果,另外一台是thinkPad。还有就是双休。。。。哇 哈哈,其他的都差不多把。。。另外一点我自己比较喜欢的是我可以单独安心的做我的iOS。也是我当初看中的...... 我始终坚信,努力都是靠自己,成长的路都是自己走出来的,青春没有后悔!
这边我要开发的项目是关于流量管理的,界面中的一个比较抢眼的效果就是:在一个圆圈中,水波浪不停的在动,而且会类似涨潮的能力。 这点也很吸引我,我也是第一次看到这种东西,也不知道它到底怎么实现的。还以为源码有多高深莫测,于是乎就在网上找了一些代码来阅读。 读了之后才让我恍然大悟,原来这些基本知识我们都已经具备,只是没想到过而已。 其大体思想就是:
1、用正玄函数来描述波形;
2: 程序处理每个像素;
3:就是不停都刷新界面来处理 每次的结果;
此时我才对曾经看到的一句话恍然大悟:一切动画都是假象! 呵呵,的确如此 我们的眼睛跟不上计算机的刷屏而已。 其本质还是 用 CoreGraphice 来实现。
具体的代码如下 :
-(void)drawInContext:(CGContextRef)ctx{
//画图
CGPoint center = CGPointMake(self.frame.size.width / (2), self.frame.size.height / (2));
CGFloat radius=100;
CGFloat startingAngleRad=0;
CGFloat currentAngleRad=M_PI_2;
UIColor *color=[UIColor colorWithRed:99/256.0 green:183/256.0 blue:70/256.0 alpha:.5];
//percent 参数为 百分比 如 20%值 表示占直径的20% 即
CGFloat angle= asin(2*percent-1);//根据百分比算出相对于X坐标系的弧度值,当percent >0.5 时 angle 为正值,反之为负数
startingAngleRad=-angle;//算出开始边缘
currentAngleRad=M_PI+angle;//算出结束边缘
CGFloat y=2*radius*percent-radius;//算出y 方向的相对圆心坐标
CGFloat x=percent!=0.5?y/tan(angle):radius;//算出x方向的长度
x=abs(x);//计算绝对值
CGFloat min_X=center.x-x;//计算出在屏幕中的绝对坐标 最小值
CGFloat max_X=center.x+x;//计算出屏幕中的绝对坐标 最大值
// Arc
CGContextBeginPath( ctx );
//CGContextMoveToPoint( ctx, center.x, center.y );//起点 (这里以中心为第一个点)
//1、添加第一点
CGContextMoveToPoint( ctx, center.x-x, center.y-y );
CGFloat h=center.y-y;
//2、添加水波浪效果,正玄函数 来计算每一个像素的坐标
for (int i=min_X; i<=max_X; ++i) {
y=h+4*sin((i+moveOffset)*M_PI/60);
CGContextAddLineToPoint(ctx, i, y);
}
/*3、添加弧度
* 参数说明:x,y 为圆的中心点
:radius 为半径长度
:startAngle 为起点弧度
:currentAnge 是指结束到弧度
:最后一个参数是NO表示 按照顺时针计算弧度,否则表示逆时针计算弧度。
*/
CGContextAddArc( ctx, center.x, center.y, radius, startingAngleRad, currentAngleRad, NO );
CGContextClosePath(ctx);
CGContextSetFillColorWithColor( ctx, color.CGColor );
CGContextSetStrokeColorWithColor( ctx, color.CGColor );
CGContextSetLineWidth( ctx, 1 );
CGContextDrawPath( ctx, kCGPathFillStroke );
}
@end
效果图如下: