//

//  ViewController.m

//  DMHeartFlyAnimation

//

//  Created by Rick on 16/3/9.

//  Copyright © 2016年 Rick. All rights reserved.

//

#import "ViewController.h"

#import "DMHeartFlyView.h"

@interface ViewController ()

{

CGFloat _heartSize;

NSTimer *_burstTimer;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

_heartSize = 36;

self.view.backgroundColor = [UIColor lightGrayColor];

self.view.userInteractionEnabled = YES;

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(showTheLove)];

[self.view addGestureRecognizer:tapGesture];

UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressGesture:)];

longPressGesture.minimumPressDuration = 0.2;

[self.view addGestureRecognizer:longPressGesture];

}

//点击

-(void)showTheLove{

DMHeartFlyView* heart = [[DMHeartFlyView alloc]initWithFrame:CGRectMake(0, 0, _heartSize, _heartSize)];

[self.view addSubview:heart];

CGPoint fountainSource = CGPointMake(20 + _heartSize/2.0, self.view.bounds.size.height - _heartSize/2.0 - 10);

heart.center = fountainSource;//创建的地方

[heart animateInView:self.view];

}

//长按

-(void)longPressGesture:(UILongPressGestureRecognizer *)longPressGesture{

switch (longPressGesture.state) {

case UIGestureRecognizerStateBegan:

_burstTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(showTheLove) userInfo:nil repeats:YES];

break;

case UIGestureRecognizerStateEnded:

[_burstTimer invalidate];

_burstTimer = nil;

break;

default:

break;

}

}

@end

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//

//  DMHeartFlyView.h

//  DMHeartFlyAnimation

//

//  Created by Rick on 16/3/9.

//  Copyright © 2016年 Rick. All rights reserved.

//

#import <Foundation/Foundation.h>

#import <UIKit/UIKit.h>

@interface DMHeartFlyView : UIView

-(void)animateInView:(UIView *)view;

@end

//

//  DMHeartFlyView.m

//  DMHeartFlyAnimation

//

//  Created by Rick on 16/3/9.

//  Copyright © 2016年 Rick. All rights reserved.

//

#define DMRGBColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]

#define DMRGBAColor(r, g, b ,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a]

#define DMRandColor DMRGBColor(arc4random_uniform(255), arc4random_uniform(255), arc4random_uniform(255))

#import "DMHeartFlyView.h"

//@interface DMHeartTheme ()

//

//@end

//

//@implementation DMHeartTheme

//

//@end

@interface DMHeartFlyView ()

@property(nonatomic,strong) UIColor *strokeColor;

@property(nonatomic,strong) UIColor *fillColor;

@end

@implementation DMHeartFlyView

-(instancetype)initWithFrame:(CGRect)frame{

self = [super initWithFrame:frame];

if (self) {

_strokeColor = [UIColor whiteColor];

_fillColor = DMRandColor;

self.backgroundColor = [UIColor clearColor];

self.layer.anchorPoint = CGPointMake(0.5, 1);

}

return self;

}

static CGFloat PI = M_PI;

-(void)animateInView:(UIView *)view{

NSTimeInterval totalAnimationDuration = 6;

CGFloat heartSize = CGRectGetWidth(self.bounds);

CGFloat heartCenterX = self.center.x;

CGFloat viewHeight = CGRectGetHeight(view.bounds);

//Pre-Animation setup

self.transform = CGAffineTransformMakeScale(0, 0);

self.alpha = 0;

//Bloom弹簧效果

[UIView animateWithDuration:0.5 delay:0.0 usingSpringWithDamping:0.6 initialSpringVelocity:0.8 options:UIViewAnimationOptionCurveEaseOut animations:^{

self.transform = CGAffineTransformIdentity;

self.alpha = 0.9;

} completion:NULL];

NSInteger i = arc4random_uniform(2);

NSInteger rotationDirection = 1- (2*i);// -1 OR 1

NSInteger rotationFraction = arc4random_uniform(10);

[UIView animateWithDuration:totalAnimationDuration animations:^{

self.transform = CGAffineTransformMakeRotation(rotationDirection * PI/(16 + rotationFraction*0.2));

} completion:NULL];

//上升路径

UIBezierPath *heartTravelPath = [UIBezierPath bezierPath];

[heartTravelPath moveToPoint:self.center];

//random end point

CGPoint endPoint = CGPointMake(heartCenterX + (rotationDirection) * arc4random_uniform(2*heartSize), viewHeight/6.0 + arc4random_uniform(viewHeight/4.0));

//random Control Points

NSInteger j = arc4random_uniform(2);

NSInteger travelDirection = 1- (2*j);// -1 OR 1

//randomize x and y for control points

CGFloat xDelta = (heartSize/2.0 + arc4random_uniform(2*heartSize)) * travelDirection;

CGFloat yDelta = MAX(endPoint.y ,MAX(arc4random_uniform(8*heartSize), heartSize));

CGPoint controlPoint1 = CGPointMake(heartCenterX + xDelta, viewHeight - yDelta);

CGPoint controlPoint2 = CGPointMake(heartCenterX - 2*xDelta, yDelta);

//上升的曲线

[heartTravelPath addCurveToPoint:endPoint controlPoint1:controlPoint1 controlPoint2:controlPoint2];

CAKeyframeAnimation *keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

keyFrameAnimation.path = heartTravelPath.CGPath;

keyFrameAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

keyFrameAnimation.duration = totalAnimationDuration + endPoint.y/viewHeight;

[self.layer addAnimation:keyFrameAnimation forKey:@"positionOnPath"];

//Alpha & remove from superview

[UIView animateWithDuration:totalAnimationDuration animations:^{

self.alpha = 0.0;

} completion:^(BOOL finished) {

[self removeFromSuperview];

}];

}

-(void)drawRect:(CGRect)rect{

//    UIImage *heartImage = [UIImage imageNamed:@"heart"];

//    UIImage *heartImageBorder = [UIImage imageNamed:@"heartBorder"];

//

//    //Draw background image (mimics border)

//    UIGraphicsBeginImageContextWithOptions(heartImageBorder.size, NO, 0.0f);

//    [_strokeColor setFill];

//    CGRect bounds = CGRectMake(0, 0, heartImageBorder.size.width, heartImageBorder.size.height);

//    UIRectFill(bounds);

//    [heartImageBorder drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0];

//    heartImageBorder = UIGraphicsGetImageFromCurrentImageContext();

//    UIGraphicsEndImageContext();

//

//    //Draw foreground heart image

//    UIGraphicsBeginImageContextWithOptions(heartImage.size, NO, 0.0f);

//    [_fillColor setFill];

//    CGRect bounds1 = CGRectMake(0, 0, heartImage.size.width, heartImage.size.height);

//    UIRectFill(bounds1);

//    [heartImage drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0];

//    heartImage = UIGraphicsGetImageFromCurrentImageContext();

//    UIGraphicsEndImageContext();

[self drawHeartInRect:rect];

}

//画心

-(void)drawHeartInRect:(CGRect)rect{

[_strokeColor setStroke];

[_fillColor setFill];

CGFloat drawingPadding = 4.0;

CGFloat curveRadius = floor((CGRectGetWidth(rect) - 2*drawingPadding) / 4.0);

//Creat path

UIBezierPath *heartPath = [UIBezierPath bezierPath];

//1.Start at bottom heart tip// floor()向下取整

CGPoint tipLocation = CGPointMake(floor(CGRectGetWidth(rect) / 2.0), CGRectGetHeight(rect) - drawingPadding);

[heartPath moveToPoint:tipLocation];//起点

//2.Move to top left start of curve

CGPoint topLeftCurveStart = CGPointMake(drawingPadding, floor(CGRectGetHeight(rect) / 2.4));

[heartPath addQuadCurveToPoint:topLeftCurveStart controlPoint:CGPointMake(topLeftCurveStart.x, topLeftCurveStart.y + curveRadius)];////画二元曲线,一般和moveToPoint配合使用

//3.Create top left curve

[heartPath addArcWithCenter:CGPointMake(topLeftCurveStart.x + curveRadius, topLeftCurveStart.y) radius:curveRadius startAngle:PI endAngle:0 clockwise:YES];

//4.Create top right curve

CGPoint topRightCurveStart = CGPointMake(topLeftCurveStart.x + 2*curveRadius, topLeftCurveStart.y);

[heartPath addArcWithCenter:CGPointMake(topRightCurveStart.x + curveRadius, topRightCurveStart.y) radius:curveRadius startAngle:PI endAngle:0 clockwise:YES];

//5.Final curve to bottom heart tip

CGPoint topRightCurveEnd = CGPointMake(topLeftCurveStart.x + 4*curveRadius, topRightCurveStart.y);

[heartPath addQuadCurveToPoint:tipLocation controlPoint:CGPointMake(topRightCurveEnd.x, topRightCurveEnd.y + curveRadius)];

[heartPath fill];

heartPath.lineWidth = 1;

heartPath.lineCapStyle = kCGLineCapRound;

heartPath.lineJoinStyle = kCGLineCapRound;

[heartPath stroke];

}

@end

直播点赞,上升的动画-- CAKeyFrameAnimation的更多相关文章

  1. iOS:核心动画之关键帧动画CAKeyframeAnimation

    CAKeyframeAnimation——关键帧动画 关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是: –CABasicAnimation只能 ...

  2. 放yy直播点赞动画

    最近在做直播相关的东西,这个动画是IOS先撸出来的,后来android这边要模仿,大部分直播应用都有很炫酷的点赞动画,所以也没什么好稀奇的.如果有现成的轮子了,就没必要自己再造了,后来参照了程序亦非猿 ...

  3. iOS直播点赞动画,iOS直播心型点赞动画

    https://github.com/songxing10000/LikeAnimation-PraiseAnimation

  4. 核心动画 - CAKeyframeAnimation 简单应用

    核心动画: 登录按钮的抖动效果: CAKeyframeAnimation * kfAnimation = [CAKeyframeAnimation animationWithKeyPath:@&quo ...

  5. 从QQ音乐开发,探讨如何利用腾讯云SDK在直播中加入视频动画

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 看着精彩的德甲赛事,突然裁判一声口哨,球赛断掉了,屏幕开始自动播放"吃麦趣鸡盒,看德甲比赛&q ...

  6. iOS动画:CAKeyframeAnimation

    网络中Core Animation类的继承关系图       属性简介 @interface CAKeyframeAnimation : CAPropertyAnimation /* 提供关键帧数据的 ...

  7. Android 开发技术周报 Issue#273

    新闻/News Android 11有新玩法:双击手机背部截屏/进入多任务界面 Android 11 DP2证实了类似AirDrop的附近文件分享功能 谷歌发布Camera Go:即使入门机也能有出色 ...

  8. 核心动画(CAKeyframeAnimation)

    Main.storyboard ViewController.m // //  ViewController.m //  8A02.核心动画 - CAKeyframeAnimation // //  ...

  9. 核心动画(CAKeyframeAnimation,CABasicAnimation)

    一,核心动画常用的三种例子 view的核心动画其体现就是把view按照指定好的路径进行运动,针对的是view的整体. [view.layer addAnimation:动画路径 forKey:@“绑定 ...

随机推荐

  1. Python垃圾回收机制:gc模块

    在Python中,为了解决内存泄露问题,采用了对象引用计数,并基于引用计数实现自动垃圾回收. 由于Python 有了自动垃圾回收功能,就造成了不少初学者误认为不必再受内存泄漏的骚扰了.但如果仔细查看一 ...

  2. eclipse DDMS导出文件失败--android Failed to push the item

    我们在写安卓程序的时候,经常会用Eclipse导出模拟器的文件管理里面的文件,但有时候会报错,导致无法导出文件. 报错信息 Failed to push selection: Local path d ...

  3. Windows10更新后无限重启

    以安全模式进入系统,禁用或卸载显卡驱动. 重启后重新安装驱动.

  4. Ros学习——launch文件解析

    launch文件的重点是:节点(node)元素的集合. roslaunch 则是让所有的节点共享同一个终端. 1.标签(元素)说明 1. group标签 2. node标签 <group ns= ...

  5. ROS Learning-019 learning_tf-03(编程) 添加额外的坐标系 (Python版)

    ROS Indigo learning_tf-03 添加额外的坐标系 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.0 ...

  6. 初识 Redis

    浏览目录 什么是redis redis的特点 redis的安装和基本使用 操作模式 连接池 操作 string操作 hash操作 list操作 什么是Redis? redis是一个key-value存 ...

  7. oracle创建数据库的语句

    首先 oracle严格来说表空间的概念和数据库的概念很像,为了理解的方便我们,可以把表空间就先当成数据库 我们在安装oracle的服务端的时候默认会安装一些,默认实例 1.建立表空间,现在解释下面语句 ...

  8. 数据结构_coprime_sequence(互质序列)

    coprime_sequence(互质序列) 问题描述 顾名思义,互质序列是满足序列元素的 gcd 为 1 的序列.比如[1,2,3],[4,7,8],都是互质序列. [3,6,9]不是互质序列.现在 ...

  9. 解决.jsp及静态资源文件访问404的问题

    我们在做Web项目时,经常将.jsp文件放到webapp\WEB-INF下,这时,我们访问jsp等文件的时候,就会报404. 如果是纯前后端分离的项目,后端只返回数据,不处理页面,也没问题.但,有时我 ...

  10. 抽象类(abstract)【转】

    抽象类(abstract) abstract修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用abstract修饰符以指示某个类只能是其它类的基类.标记为抽象或包含在抽象类中的成员必须通 ...