语音聊天源码开发之常用动画效果的实现
效果展示
下面是语音聊天源码开发中比较入门的豪华礼物动画——烟花。
一个复杂的礼物动画,首先是美术给出gif实现草图和素材,技术进行动画剖析和图片压缩,在语音聊天源码中加载图片和实现动画,其中要注意内存和CPU占用。
图片压缩、加载与裁剪
1、图片压缩
美术给出的图片,即使是压缩过,仍存在较大的压缩空间,可以用这里或者更好的大小优化。
2、图片加载
主要有-imageNamed: 和 -imageWithContentsOfFile:两种方式。
AnimationImageCache类是一个动画图片加载类,用单例实现且内部用NSCache持有引用。
注意,当收到语音聊天源码内存不足警告时,NSCache会自动释放内存。所以每次访问NSCache,即使上一次已经加载过,也需要判断返回值是否为空。
3、图片裁剪
为了减少图片资源的大小,有时候会把多个帧动画做成连续的一张图。这时需要语音聊天源码加载一整张资源图,并在相应的位置进行裁剪。
UIImage* sourceImage = [UIImage imageNamed:@"image/animation/gift_boat"];CGSize sourceSize = sourceImage.size;CGImageRef cgimage = CGImageCreateWithImageInRect(sourceImage.CGImage,CGRectMake(0, 0, const_position_boat_x, sourceSize.height));gWaveFrameImage = [UIImage imageWithCGImage:cgimage];CGImageRelease(cgimage);cgimage = CGImageCreateWithImageInRect(sourceImage.CGImage,CGRectMake(const_position_boat_x, 0, const_position_boat_width, sourceSize.height));gBoatFrameImage = [UIImage imageWithCGImage:cgimage];CGImageRelease(cgimage);cgimage = CGImageCreateWithImageInRect(sourceImage.CGImage,CGRectMake(const_position_boat_x + const_position_boat_width, 0, sourceSize.width - const_position_boat_x - const_position_boat_width, sourceSize.height));gShadowFrameImage = [UIImage imageWithCGImage:cgimage];CGImageRelease(cgimage);
动画剖析与时间轴
下面这个是一个全屏类型的“天使”礼物动画,我们来剖析下这个动画的构成。
- 1、背景变暗,出现星空;
- 2、流星划过、月亮出现、云彩飘动;
- 3、两侧浮空岛震动,中间浮空岛出现;
- 4、背光出现,天使落下,翅膀扇动;
- 5、星星闪烁、凤凰出现;
- 6、渐隐消失;
时间轴实现
为了让语音聊天源码中的动画按照时间顺序一一执行,可以把动画按时间和对象分成多个方法,通过GCD在指定的时间调用。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self playMeteorAnimation];});dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self playLandAnimation];});dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self playLightAnimation];});dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(7.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self playStarAnimation];});dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(TOTAL_TIME * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{@weakify(self);[UIView animateWithDuration:0.5 animations:^{self.alpha = 0;} completion:^(BOOL finished) {@strongify(self);[self removeFromSuperview];[self callBackManager];}];});
常用动画效果
1、视图变暗、变大
alpha值属性是透明度,把语音聊天源码聊天室背景设置成淡黑色,然后调整alpha可以达到背景渐变的视图效果;
UIView的transform是可以用仿射变换矩阵来控制平移、放大缩小等。
[UIView animateWithDuration:1.5 animations:^{self.mBackgroundView.alpha = 0.5;self.mAngelView.transform = CGAffineTransformMakeScale(1.2, 1.2);}];
2、匀速运动、交错效果
right是语音聊天源码开发封装的一个属性,本质是对UIView的frame进行操作;
两朵云, 左边的朝右,右边的朝左,即可达到交错的效果。
[UIView animateWithDuration:TOTAL_TIME delay:0 options:UIViewAnimationOptionCurveLinear animations:^{self.mAngelCloudView0.right += 250;self.mAngelCloudView1.right -= 190;} completion:nil];
3、上下往返运动
CAKeyframeAnimation是关键帧动画,对layer的postion的y坐标进行操作;
设定好起始位置、经过位置,最后回到起始位置,即可实现上下往返的效果。
CAKeyframeAnimation *upDownAnimation;
upDownAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position.y"];
upDownAnimation.values = @[@(self.mAngelLandView1.layer.position.y), @(self.mAngelLandView1.layer.position.y + 5), @(self.mAngelLandView1.layer.position.y)];
upDownAnimation.duration = 2;
upDownAnimation.fillMode = kCAFillModeBoth;
upDownAnimation.calculationMode = kCAAnimationCubic;
upDownAnimation.repeatCount = HUGE_VALF;
[self.mAngelLandView1.layer addAnimation:upDownAnimation forKey:@"upDownAnimation"];
4、闪烁效果
闪烁的本质是alpha的变化,但是UIView的block动画不好实现重复效果;
UIView的alpha对应的是layer的opacity属性,设定好起始、过度和结束的状态,实现闪烁的效果。
CAKeyframeAnimation *opacityAnimation;
opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.values = @[@(0), @(1), @(0)];
opacityAnimation.duration = 1.5;
opacityAnimation.fillMode = kCAFillModeBoth;
opacityAnimation.calculationMode = kCAAnimationCubic;
opacityAnimation.repeatCount = HUGE_VALF;
[self.mAngelStarView.layer addAnimation:opacityAnimation forKey:@"opacityAnimation"];
5、贝塞尔曲线运动
贝塞尔曲线是优化语音聊天源码动画体验的很重要部分,比如说天上掉下来的羽毛,地上冒起来的气泡,空中飘荡的气球,都可以用贝塞尔曲线来绘制,从而获得很好的视觉体验;
本质还是关键帧动画,这次操作的属性是position,通过path属性来确定路径;
给贝塞尔曲线设定好目标点后,把path赋值给关键帧动画,再把动画添加到layer上即可;
UIImage *image = [[AnimationImageCache shareInstance] getImageWithName:@"gift_castle_hot_air_balloon3.png"];UIImageView *hotAirBalloonView0 = [[UIImageView alloc] initWithFrame:CGRectMake(50, 100, image.size.width / 2, image.size.height / 2)];[self addSubview:hotAirBalloonView0];[hotAirBalloonView0 setImage:image];// 飘动CGPoint position = CGPointMake(self.width, hotAirBalloonView0.top);CGFloat duration = 5;CAKeyframeAnimation *positionAnimate = [CAKeyframeAnimation animationWithKeyPath:@"position"];positionAnimate.repeatCount = 1;positionAnimate.duration = duration;positionAnimate.fillMode = kCAFillModeForwards;positionAnimate.removedOnCompletion = NO;UIBezierPath *sPath = [UIBezierPath bezierPath];[sPath moveToPoint:position];[sPath addCurveToPoint:CGPointMake(-image.size.width / 2, position.y) controlPoint1:CGPointMake(self.width / 3 * 2, position.y - 60) controlPoint2:CGPointMake(self.width / 3, position.y + 60)];positionAnimate.path = sPath.CGPath;[hotAirBalloonView0.layer addAnimation:positionAnimate forKey:@"positionAnimate"];
6、遮罩动画
遮罩效果可以实现语音聊天源码中彩虹
语音聊天源码开发之常用动画效果的实现相关推荐
- cocos creator麻将教程系列(八)—— 达达麻将语音聊天源码分析
达达麻将语音聊天源码分析 达达麻将版图 语音聊天 1:语音聊天只支持Native平台,iOS与android; 2: 语音聊天的音频格式为amr; 3: native平台实现了语音的录制和播放,可以移 ...
- 视频聊天源码开发,如何进行代码优化
前言 公司的视频聊天源码,有不少类14年的代码也有,可谓见证了该项目的持续辉煌,结果一搜,有些类没有被调用,看来当年的开发者不忍心删掉,就持续到现在了.我相信不少项目都会出现这种情况,要么先注释掉,要 ...
- android+微信语音,android 仿微信按住语音说话(语音聊天)源码下载
[实例简介] [实例截图] [核心代码] package com.example.weixin_record; import java.util.ArrayList; import java.util ...
- 一对一视频聊天源码中的语言包应该如何开发
作为专业的一对一视频聊天源码开发服务商,与国外客户打交道是必不可少的,但是由于语言不同所以在开发和后期搭建部署时会遇到一些障碍. 除此之外还需要考虑国外客户在其所在国家上线运营时的语言问题,这就需要开 ...
- 语音陪玩源码如何做到不卡顿?
对于语音通话来说,当延时高于200ms时,就会影响到用户的体验,达到460ms时,就能让对方用户很明显的感知出来,1s以上的延迟在交互式的语音聊天中不被接受,所以在语音陪玩源码开发时,要注意语音连麦技 ...
- 直播系统源码开发:关于安卓开发工具和obs直播推流
随着移动互联网技术的不算发展,直播系统源码不再局限于娱乐直播的范畴,而是被广泛的应用于各行各业.尤其对于今年来说,购物直播行业的迅速发展,对直播系统源码开发的需求进一步扩大,同时对直播源码开发技术也有 ...
- 语音聊天室源码开发点赞功能,用 MySQL 还是 Redis ?
为了提升用户在语音聊天室源码中的互动性,一般在开发动态广场功能时会支持用户间对动态进行点赞,所以点赞功能可以说是语音聊天室源码开发的基础性功能,今天我们就来聊聊点赞.评论.收藏等这些场景的db数据库设 ...
- Android聊天室源码开发,悬浮窗的实现及封装思路
为了实现语音聊天室源码的多场景应用,悬浮小窗口在语音聊天室源码开发中还是比较常见的需求,主要是指用户在语音连麦过程中打开其它界面或者退到桌面时语音连麦不会中断且会有一个悬浮小窗口位于最上层,接下来我们 ...
- 语音系统源码的开发,一对一语音直播源码
对于大多数人来说,直播已经不再陌生了,所谓是家喻户晓,只要是有智能手机,对于直播肯定是有所了解,对于直播大家想到是娱乐性的互动直播,其实视频直播的话也不是只有这一种方式,还有语音直播等多种类型的直播方 ...
最新文章
- Linux字符模式下的“远程桌面共享”及屏幕录制
- boost::overwrite相关的测试程序
- android 关于listview scrollview 底部 控件无法显示的两个解决方案
- 安装服务时出现The system cannot execute the specified program
- 各式各样的极品程序员 你属于哪一种
- 2020,我的年终总结(附优惠券)
- 国内做得好的进销存软件有哪些啊?
- access ea 可以联网吗_如何看待EA在STEAM上推出EA Play(原EA Access会员)?
- Ansys-结构动力学分析-有预应力琴弦横向振动模态分析学习收获
- 我手机计算机屏幕是黑色的,教你处理手机或者电脑黑屏的简单方法
- 产品经理学习——卡诺模型
- 秋叶原妄想物语 全卡片图鉴 アキバズビート トレカ
- 分享 : 微软Kinect初体验
- 干货分享!一份你不知道的武汉Web前端开发学习攻略
- 如何选择引流脚本,引流脚本哪家强?
- android 文件扫描MediaStore
- Opencv获取电脑摄像头抓拍的信息,
- 解决Ubuntu14.04不能打正确拼音--无法选择第二个拼音
- Java学习笔记 --- 多线程
- 正确率,精确率,召回率.