直播点赞,上升的动画-- CAKeyFrameAnimation
//
// 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的更多相关文章
- iOS:核心动画之关键帧动画CAKeyframeAnimation
CAKeyframeAnimation——关键帧动画 关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是: –CABasicAnimation只能 ...
- 放yy直播点赞动画
最近在做直播相关的东西,这个动画是IOS先撸出来的,后来android这边要模仿,大部分直播应用都有很炫酷的点赞动画,所以也没什么好稀奇的.如果有现成的轮子了,就没必要自己再造了,后来参照了程序亦非猿 ...
- iOS直播点赞动画,iOS直播心型点赞动画
https://github.com/songxing10000/LikeAnimation-PraiseAnimation
- 核心动画 - CAKeyframeAnimation 简单应用
核心动画: 登录按钮的抖动效果: CAKeyframeAnimation * kfAnimation = [CAKeyframeAnimation animationWithKeyPath:@&quo ...
- 从QQ音乐开发,探讨如何利用腾讯云SDK在直播中加入视频动画
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 看着精彩的德甲赛事,突然裁判一声口哨,球赛断掉了,屏幕开始自动播放"吃麦趣鸡盒,看德甲比赛&q ...
- iOS动画:CAKeyframeAnimation
网络中Core Animation类的继承关系图 属性简介 @interface CAKeyframeAnimation : CAPropertyAnimation /* 提供关键帧数据的 ...
- Android 开发技术周报 Issue#273
新闻/News Android 11有新玩法:双击手机背部截屏/进入多任务界面 Android 11 DP2证实了类似AirDrop的附近文件分享功能 谷歌发布Camera Go:即使入门机也能有出色 ...
- 核心动画(CAKeyframeAnimation)
Main.storyboard ViewController.m // // ViewController.m // 8A02.核心动画 - CAKeyframeAnimation // // ...
- 核心动画(CAKeyframeAnimation,CABasicAnimation)
一,核心动画常用的三种例子 view的核心动画其体现就是把view按照指定好的路径进行运动,针对的是view的整体. [view.layer addAnimation:动画路径 forKey:@“绑定 ...
随机推荐
- python metaclass(元类)
metaclass(元类) 一.创建类的执行流程 二.元类的认识 什么是元类呢?在Python3中继承type的就是元类 二.元类的示例 方式一: # 方式一 class MyType(type): ...
- SqlServer——事务一进阶之锁的概念(SqlServer技术内幕 T-SQL程序设计 第九章)
一.事务的概念及ACID特性 对于单独一条SQL语句,数据库会隐式的将其作为事务,即该SQL语句要么执行成功,要么失败(相当于不执行),而我们通常说的事务就是将多条SQL语句放在 begin ...
- namenode和datanode机制
转自:https://www.cnblogs.com/DarrenChan/p/6416043.html?utm_source=itdadao&utm_medium=referral 首先我们 ...
- LAMP 3.3 mysql常用操作-1
有一个图形化管理 mysql 的工具叫做 phpmyadmin,如何在命令行下面来管理和操作 mysql. 首先进入mysql mysql -uroot -pwangshaojun 查看有那些库 &g ...
- VUE简单入门
Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使 ...
- Python之整数,浮点数和布尔类型
整数和浮点数有那个四则运算: 两种类型的数可以直接进行加减,当整数和浮点数进行加减的时候,结果会自动的变为浮点数,其中除法运算是“/”来表示的, 而余数的算术符号是“%”来表示的.如果是为了求除完后的 ...
- MyBatis总结二:增删改查
上一篇讲述了MyBatis的快速入门,下面在此基础上进行增删改查的操作: 首先定义dao层的接口: package com.zy.dao; import com.zy.domain.User; imp ...
- interface 接口 和多态的含义
<?php //interface关键字用于定义接口 interface ICanEat{ //接口里面的方法不需要方法的实现 public function eat($food) ; } // ...
- OpenNi安装示例
1.下载OpenNi https://structure.io/openni 解压,点击运行 选择安装目录,默认即可 安装过程中有弹框,选择 安装 点击 完成 在相应的安装目录下即可找到
- PCL — Point Pair Feature 中层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/5971976.html 机器人视觉中有一项重要人物就是从场景中提取物体的位置,姿态.图像处理算法借助Deep Lea ...