iOS使用核心动画和粒子发射器实现点赞按钮的方法

首先放上效果图,大家可以看一下

实现的方法如下

一、使用到的类

  1. CAKeyframeAnimation       // 核心动画-关键帧动画
  2. CAEmitterLayer            // 粒子发射器(其实就是一个Layer,其父类是CALayer)
  3. CAEmitterCell             // 粒子
  4. PS:核心动画应该不用多说了;
  5. CAEmitterLayer和CAEmitterCell,其实可以比喻成“炮”和“炮弹”,应该不难理解;

二、直接上部分关键代码 代码中会有详细的注释

2.1 .m中需要拥有的属性

/** weak类型 粒子发射器 */
@property (nonatomic, weak) CAEmitterLayer *emitterLayer;

2.2 initWithFrame: 方法中

- (instancetype)initWithFrame:(CGRect)frame {
 self = [super initWithFrame:frame];
 if (self) {
 // 配置粒子发射器方法
 [self setupEmitter];
 }
 return self;
}

2.3 setSelected: 方法中

- (void)setSelected:(BOOL)selected {
 [super setSelected:selected];
 // 开始关键帧动画
 [self keyframeAnimation];
}

2.4 layoutSubviews 方法中

- (void)layoutSubviews{
 [super layoutSubviews];
 /// 设置粒子发射器的锚点
 _emitterLayer.position = self.imageView.center;
}

2.5 setupEmitter 方法中( 配置粒子发射器方法 )

- (void)setup {
 // 粒子使用CAEmitterCell初始化
 CAEmitterCell *emitterCell = [CAEmitterCell emitterCell];
 // 粒子的名字,在设置喷射个数的时候会用到
 emitterCell.name  = @"emitterCell";
 // 粒子的生命周期和生命周期范围
 emitterCell.lifetime  = 0.7;
 emitterCell.lifetimeRange = 0.3;
 // 粒子的发射速度和速度的范围
 emitterCell.velocity  = 30.00;
 emitterCell.velocityRange = 4.00;
 // 粒子的缩放比例和缩放比例的范围
 emitterCell.scale  = 0.1;
 emitterCell.scaleRange = 0.02;

 // 粒子透明度改变范围
 emitterCell.alphaRange = 0.10;
 // 粒子透明度在生命周期中改变的速度
 emitterCell.alphaSpeed = -1.0;
 // 设置粒子的图片
 emitterCell.contents  = (id)[UIImage imageNamed:@"Sparkle3"].CGImage;

 /// 初始化粒子发射器
 CAEmitterLayer *layer = [CAEmitterLayer layer];
 // 粒子发射器的 名称
 layer.name   = @"emitterLayer";
 // 粒子发射器的 形状(可以想象成打仗时,你需要的使用的炮的形状)
 layer.emitterShape  = kCAEmitterLayerCircle;
 // 粒子发射器 发射的模式
 layer.emitterMode  = kCAEmitterLayerOutline;
 // 粒子发射器 中的粒子 (炮要使用的炮弹)
 layer.emitterCells  = @[emitterCell];
 // 定义粒子细胞是如何被呈现到layer中的
 layer.renderMode  = kCAEmitterLayerOldestFirst;
 // 不要修剪layer的边界
 layer.masksToBounds  = NO;
 // z 轴的相对坐标 设置为-1 可以让粒子发射器layer在self.layer下面
 layer.zPosition  = -1;
 // 添加layer
 [self.layer addSublayer:layer];
 _emitterLayer = layer;
}

注意:这里有一点需要详细解释一下, CAEmitterCell 的属性一般有两个参数:一个平均值和一个“Range”,比如:

// 粒子的生命周期和生命周期范围
 emitterCell.lifetime  = 0.7;
 emitterCell.lifetimeRange = 0.3;

这里苹果的官方文档是这样解释的:

每一个Layer都有它自己的随机数发生器,粒子的属性大部分都被定义为一个平均值和一个范围值,

如粒子的速度,这个属性的值分布的区间为:[ M - R / 2,M + R / 2 ]。

然后 这个公式里面

M:均值(拿上面代码说就是 emitterCell.lifetime)

R:范围值(mitterCell.lifetimeRange)

然后我们就可根据公式算出上面我设置的粒子的生命周期的范围是[0.7-0.3/2 , 0.7+0.3/2]

2.6 keyframeAnimation 方法中 (开始关键帧动画)

- (void)animation {
 // 创建关键帧动画
 CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
 if (self.selected) {
 animation.values = @[@1.5 ,@0.8, @1.0,@1.2,@1.0];
 animation.duration = 0.5;
 // 粒子发射器 发射
 [self startFire];
 }else
 {
 animation.values = @[@0.8, @1.0];
 animation.duration = 0.4;
 }
 // 动画模式
 animation.calculationMode = kCAAnimationCubic;
 [self.imageView.layer addAnimation:animation forKey:@"transform.scale"];
}

这段代码没什么说的,应该很容易理解。

2.7 startFire 方法中 (开炮)

- (void)startFire{
 // 每秒喷射的80个
 [self.emitterLayer setValue:@1000 forKeyPath:@"emitterCells.emitterCell.birthRate"];
 // 开始
 self.emitterLayer.beginTime = CACurrentMediaTime();
 // 执行停止
 [self performSelector:@selector(stopFire) withObject:nil afterDelay:0.1];

}

2.8 stopFire 方法中 (停火)

- (void)stopFire {
 //每秒喷射的个数0个 就意味着关闭了
 [self.emitterLayer setValue:@0 forKeyPath:@"emitterCells.emitterCell.birthRate"];
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • IOS 粒子系统 (CAEmitterLayer)实例详解

    一.系统剖析 在UIKit中,粒子系统由两部分组成: ·      一个或多个CAEmitterCells:发射器电池可以看作是单个粒子的原型(例如,一个单一的粉扑在一团烟雾).当散发出一个粒子,UIKit根据这个发射粒子和定义的基础上创建一个随机粒子.此原型包括一些属性来控制粒子的图片,颜色,方向,运动,缩放比例和生命周期. ·      一个或多个CAEmitterLayers,但通常只有一个:这个发射的层主要控制粒子的形状(例如,一个点,矩形或圆形)和发射的位置(例如,在矩形内,或边缘).

  • iOS CAEmitterLayer实现粒子发射动画效果

    iOS实现粒子发射动画效果图 代码已上传 GitHub:https://github.com/Silence-GitHub/CoreAnimationDemo 动画效果用 CAEmitterLayer 实现.CAEmitterLayer 显示粒子发射动画,具体的粒子由 CAEmitterCell 封装.代码示例是展示 CAEmitterLayer 如何使用.为了方便,直接在控制器(UIViewController)中设置 CAEmitterLayer.如果在项目中使用,有时在自定义视图(UIVi

  • iOS中利用CAEmitterLayer实现粒子动画详解

    前言 你肯定见过很酷炫的iOS动画吧,例如微信的表情雨

  • iOS实现爆炸的粒子效果示例代码

    照例我们先看看效果图 怎么样?效果很不错吧,下面来一起看看实现的过程和代码示例. 实现原理 从图中可以大致看出,爆炸点点都是取的某坐标的颜色值,然后根据一些动画效果来完成的. 取色值 怎么取的view的某个点的颜色值呢?google一下,就可以找到很多答案.就不具体说了.创建1*1的位图,然后渲染到屏幕上,然后得到RGBA.我这里写的是UIView的extension. extension UIView { public func colorOfPoint(point:CGPoint) -> U

  • iOS使用核心动画和粒子发射器实现点赞按钮的方法

    首先放上效果图,大家可以看一下 实现的方法如下 一.使用到的类 CAKeyframeAnimation       // 核心动画-关键帧动画 CAEmitterLayer            // 粒子发射器(其实就是一个Layer,其父类是CALayer) CAEmitterCell             // 粒子 PS:核心动画应该不用多说了; CAEmitterLayer和CAEmitterCell,其实可以比喻成"炮"和"炮弹",应该不难理解; 二.

  • iOS仿小红书呼吸灯动画(核心动画和定时器)两种方式实现

    最近公司需求做个类似小红书的标签呼吸灯动画,经过一段时间研究使用两种方式实现了该效果... 第一种方式使用定时器加 UIView动画,核心方法如下 -(void)begigFlashAnimation { // 缩放 + 透明度动画 self.flashView.transform = CGAffineTransformMakeScale(0.1, 0.1); [UIView animateWithDuration:3 animations:^{ self.flashView.transform

  • iOS 控制器自定义动画跳转方法(模态跳转)

    参考资料: Apple 开发文档 Customizing the Transition Animations WWDC 2013 Custom Transitions Using View Controllers 图例: 跳转的动画有很多,全部可以自定义 创建自定义跳转必须遵循的三个步骤: 1.创建一个类,并实现了 UIViewControllerAnimatedTransitioning 协议 2.创建一个类作为 UIViewControllerTransitioningDelegate 过渡

  • IOS登录页面动画、转场动画开发详解

    动画效果 需求分析 分析方法 下载这个gif动图,用mac默认的打开方式打开这个gif图(双击图片即可),效果如下 鼠标选中红色箭头所指的位置,然后按住键盘方向键下键,图片会以缓慢的可控的速度播放,便于分析动画的构成. 小tips:macos系统想正常浏览一个gif动图,可以鼠标单击图片后按空格,也可以选择用浏览器打开,gif图会以正常速度播放. 技术点分析 如何生成一个动画让控件执行? 现流行的方式主要有三种: 1.基本动画 2.核心动画 3.三方框架--POP框架(由Facebook开发)

  • IOS等待时动画效果的实现

    查询时间或长或短,为了提升用户体验,目前用的比较多的手段之一就是查询等待时添加一个动态等待效果.当我们在请求网络时加载页面时有个动作效果,效果图如下: 源代码可以网上找开源项目Coding.net,上面的效果原理为两张图片组合,外面那个则为动画转动,里面的图标则是透明度的变化:主要代码如下: 1:把它封装在EaseLoadingView里面 @interface EaseLoadingView : UIView @property (strong, nonatomic) UIImageView

  • iOS自带动画效果的实例代码

     1.普通动画: [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:2]; frame.origin.x += 150; [img setFrame:frame]; [UIView commitAnimations]; 2.连续动画(一系列图像): NSArray *myImages = [NSArray arrayWithObjects: [UIImage imageNamed:@"myImage1.p

  • iOS实现大雪纷飞动画

    本文实例为大家分享了iOS实现大雪纷飞动画的具体代码,供大家参考,具体内容如下 1.结果展示 美丽的雪花,勾起了多少美好的回忆. 2.制作思路 其实创作这样一个大学纷飞的场景是十分简单的,简单到你看了教程之后想不会都不行.OK,下面国际惯例,讲解一下思路吧. 1.创建一个数组用来保存大量的雪花 _imagesArray = [[NSMutableArray alloc] init]; for (int i = 0; i < 1000; ++ i) { UIImageView *imageView

  • iOS使用核心的50行代码撸一个路由组件

    使用组件化是为了解耦处理,多个模块之间通过协议进行交互.而负责解析协议,找到目的控制器,或者是返回对象给调用者的这个组件就是路由组件.本文讲解如何使用核心的50行代码实现一个路由组件. 组件化和路由 路由的实现 路由注册实现 路由使用实现 客户端的使用 一些小想法 组件化和路由 之前看过挺多的关于路由管理.路由处理的文章,常常会和组件化出现在一起,一开始不知道为何路由和组件化出现在一起,后来公司的项目中使用了路由组件(他本身也是一个组件,确切的说是一个中间人或者中介者),才突然想明白了,原来如此

  • iOS表视图之下拉刷新控件功能的实现方法

    下拉刷新是重新刷新表视图或列表,以便重新加载数据,这种模式广泛用于移动平台,相信大家对于此也是非常熟悉的,那么iOS是如何做到的下拉刷新呢? 在iOS 6之后,UITableViewControl添加了一个refreshControl属性,该属性保持了UIRefreshControl的一个对象指针.UIRefreshControl就是表视图实现下拉刷新提供的类,目前该类只能用于表视图界面.下面我们就来试试该控件的使用. 编写代码之前的操作类似于前面几篇文章.代码如下: #import "View

随机推荐