类似气泡的动画随笔
做iOS也有段时间了,也经常从博客上获取一些资料代码等有用信息,并且身边的朋友同学都在写博客,感觉是写个博客时间逼格很高的事情,所以就申请了一个,和大家分享一下自己的东西。(ps:由于自己也是个初学者,所有有些不对的地方还请大家指正,让我更好的提高)。
好了,废话不多说,这篇博文的重点是介绍一下一个简单的动画效果,点击View,产生一个气泡上升的动画效果。效果如下,
其实这个效果的实现是很简单的,我贴一下自己的代码,有用的话可以参考一下.
首先,当有手指触摸事件在当前视图或window窗体中响应时会走下面的方法,并且可以获取到点击的point值.他的原理就是通过获取NSSet(当前接收者有关的所有的触摸对象)和UITouch(视图中的所有对象来判断触碰点在当前视图中的位置的(point).代码实现如下
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSSet *allTouches = [event allTouches]; UITouch *touch = [allTouches anyObject]; CGPoint point = [touch locationInView:[touch view]]; int touchX = point.x; int touchY = point.y; }
获取到点击的当前位置后,就可以开始实现动画效果了.动画分为两部分,一是气泡的产生,使用最普通的动画,设置一下动画的间断时间和气泡的大小即可.代码如下
// 最普通动画: [UIView animateWithDuration:0.5 animations:^{ //规定气泡的大小 位置 透明度,其中x y为上一步骤中获取到的x y flakeView.frame = CGRectMake(x,y,width,height); flakeView.alpha = 0.55; }];
第一步完成后气泡就产生了,接下来需要做的是气泡运动的动画,这个过程其实也是很简单的,但是需要规定一个动画结束时的坐标值,其中y只要不在屏幕内即可,x可以产生一个随机数,这样的话 就能产生气泡“乱跑 的效果”.代码如下
//随机的产生X int endX = round(random() % 1024); //随机数 产生时间间隔 double speed = 1 / round(random() % 100) + 1.0; //动画产生 消失 [UIView beginAnimations:nil context:(__bridge void * _Nullable)(flakeView)]; [UIView setAnimationDuration:5 * speed]; flakeView.frame = CGRectMake(endX, -10.0, 25.0, 25.0 ); [UIView setAnimationDidStopSelector:@selector(onAnimationComplete:finished:context:)]; [UIView setAnimationDelegate:self]; [UIView commitAnimations];
动画结束后执行下面方法让其从View上移除.代码如下,
- (void)onAnimationComplete:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { // UIImageView *flakeView = CFBridgingRelease(context); UIImageView *flakeView = (UIImageView *)[self.view viewWithTag:1]; [flakeView removeFromSuperview]; }
但是这里出现一个问题就是在这个方法里如果执行 UIImageView *flakeView = CFBridgingRelease(context);就会出现内存问题,希望有看见的大神能帮小弟解决一下疑问.
最初看到这个效果实在新版的人人上,(ps:你是不是有个疑问,怎么还有人用人人网,哈,其实我也是出于好奇),但是确实没有想到这么简单就实现了.自己是个小菜鸟,但是也很高兴和大家分享一些东西的,我写的这些其实也是很初级的东西,可能仅仅适用于初学者,如果大牛路过的话,留个赞鼓励一下,呵呵一笑就可以了。
同时也感谢网上的大牛所提供的资料。