广告
返回顶部
首页 > 资讯 > 移动开发 >iOS实现抖音点赞动画效果
  • 753
分享到

iOS实现抖音点赞动画效果

iOS抖音点赞 2022-05-31 04:05:34 753人浏览 独家记忆
摘要

本文实例为大家分享了iOS实现抖音点赞动画的具体代码,供大家参考,具体内容如下 1. 概述 最近看到抖音点赞爱心的动画效果比较好,出于好奇,自己也研究仿照动画效果写了一个,不喜欢的朋

本文实例为大家分享了iOS实现抖音点赞动画的具体代码,供大家参考,具体内容如下

1. 概述

最近看到抖音点赞爱心的动画效果比较好,出于好奇,自己也研究仿照动画效果写了一个,不喜欢的朋友可不要喷我噢!!!

话不多说,先来看一下执行效果。

2. 动画分析

上面的示例效果有点快,现在来看一个慢的,然后在分析动画组成。

这回看清楚了吧,哈哈。

2.1 动画过程分析

咱们就以10秒的点赞动画来分析一下:

点赞的时候:

点击的时候,白色爱心逐渐变小到一定程度,然后变成红色爱心。(3秒) 2、红色爱心慢慢变大,最终有个缓冲动画,然后恢复原尺寸。(7秒) 3、在红色爱心变大的时候,有一个红色的圆环逐渐变大,圆环宽度由小变大,再变小消失。(5秒) 4、在红色爱心变大的时候,还有6个环绕爱心的三角形,三角形由小变大,再变小消失。(7秒) 5、注意,2、3、4的动画是在1动画结束后同时执行的,即延迟3秒再执行。

取消点赞的时候:

点击后红色爱心逐渐变小。 2、变小后,设置不可见,并恢复原尺寸。

2.2 代码实现原理分析

自定义一个UIView,并添加两个UIImageView,分别显示红色爱心和白色爱心,红色爱心在白色爱心上面,并设置红色爱心不可见。 2、给UIView添加单击手势。 3、点击时判断是点赞还是取消点赞,如果是点赞: 4、用两个UIView自带的动画,将白色ImageView的transfORM变小,变小后不可见,然后设置红色ImageView的transform变大,变大后白色ImageView的transform变回原尺寸。 5、通过贝塞尔曲线和CAShapeLayer绘制圆环,并给圆环添加动画组CAAnimationGroup,动画组中添加了一个基础动画CABasicAnimation(将圆环从小变大)和一个关键帧动画CAKeyframeAnimation(将圆环宽度由小变大再变小消失) 6、通过贝塞尔曲线和CAShapeLayer循环绘制6个三角形,并通过CATransform3DMakeRotation旋转6个三角形,使其环绕爱心一周。 7、给每个三角形添加一个关键帧动画CAKeyframeAnimation(将三角形由小变大再变小消失) 8、如果是取消点赞,比较简单,逐渐将红色爱心变小,然后设置不可见,白色爱心自然就显示出来了。 9、在动画执行过程中,关闭用户交互,待动画结束,再打开用户交互。

分析的有些简单,只是提供一种思路,没有什么比看代码更直接的了,来吧!

3. 全部代码

代码中添加了很多的注释,方便理解。


import UIKit
 
public class LikeView: UIView {
 
 // 红色爱心视图
 fileprivate var likeImageView = UIImageView()
 // 白色爱心视图
 fileprivate var unLikeImageView = UIImageView()
 // true: 点赞, false:取消点赞
 fileprivate var isLike: Bool = false
 // 动画时长,可设置
 public var duration: CFTimeInterval = 0.5
 
 override init(frame: CGRect) {
 super.init(frame: frame)
 setupUI()
 }
 
 required init?(coder: NSCoder) {
 super.init(coder: coder)
 setupUI()
 }
 
 fileprivate func setupUI() {
 // 添加白色爱心视图
 unLikeImageView.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)
 unLikeImageView.image = UIImage(named: "icon_like_before")
 addSubview(unLikeImageView)
 
 // 添加红色爱心视图,并设置不可看。切记红色爱心在在白色爱心的上面。
 likeImageView.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)
 likeImageView.image = UIImage(named: "icon_like_after")
 likeImageView.alpha = 0
 addSubview(likeImageView)
 
 // 添加单击手势
 let tap = UITapGestureRecognizer(target: self, action: #selector(tapLikeAction))
 self.addGestureRecognizer(tap)
 }
 
 // 点击事件
 @objc fileprivate func tapLikeAction() {
 // 点击的时候停止交互,以免反复点击。
 self.isUserInteractionEnabled = false
 isLike = !isLike
 
 // 点赞
 if isLike {
 // 设置红色爱心不可见
 likeImageView.alpha = 0
 
 // 将红色爱心缩小至原来0.2倍。
 self.likeImageView.transform = CGAffineTransform(scaleX: 0.2, y: 0.2)
 
 
 
 UIView.animate(withDuration: duration * 0.3, delay: 0, options: .curveEaseInOut) { [weak self] in
 // 将白色爱心逐渐变小至0.2倍,
 self?.unLikeImageView.transform = CGAffineTransform(scaleX: 0.2, y: 0.2)
 } completion: { [weak self] (finished) in
 // 设置红色爱心可见,此时是0.2倍大小。
 self?.likeImageView.alpha = 1
 let duration = self?.duration ?? 0.5
 // 白色爱心变小后,继续操作红色爱心
 UIView.animate(withDuration: duration * 0.7, delay: 0.1, usingspringWithDamping: 0.6, initialSpringVelocity: 0.8, options: .curveEaseInOut) {
  // 将红色爱心恢复原大小
  self?.likeImageView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
 } completion: { (finished) in
  // 红色爱心变大后,恢复白色爱心的尺寸,开启用户交互。
  self?.unLikeImageView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
  self?.isUserInteractionEnabled = true
 }
 }
 
 //
 
 // 小圆环路径
 let circleStartPath = UIBezierPath(arcCenter: likeImageView.layer.position, radius: self.bounds.size.width / 6, startAngle: 0, endAngle: CGFloat(2*Double.pi), clockwise: true)
 
 // 大圆环路径
 let radius = sqrt(powf(Float(self.bounds.size.width), 2) + powf(Float(self.bounds.size.height), 2))/2
 let circleEndPath = UIBezierPath(arcCenter: likeImageView.layer.position, radius: CGFloat(radius), startAngle: 0, endAngle: CGFloat(2*Double.pi), clockwise: true)
 
 // 创建圆环图层,用于显示圆环。
 let circleLayer = CAShapeLayer()
 circleLayer.strokeColor = UIColor.red.cGColor
 circleLayer.fillColor = UIColor.clear.cgColor
 self.layer.insertSublayer(circleLayer, below: self.likeImageView.layer)
 
 // 计算圆环图层的偏移时间
 var currentTimeInSuper = self.layer.convertTime(CACurrentMediaTime(), from: nil)
 var currentTimeLocal = circleLayer.convertTime(currentTimeInSuper, from: self.layer)
 
 // 设置圆环动画组执行时间
 let circleGroupDuration = duration * 0.5
 
 // 圆环动画组
 let circleGroup = CAAnimationGroup()
 circleGroup.duration = circleGroupDuration
 // 圆环动画组开始时间,此开始时间正好是白色爱心变小后,红色爱心开始变大时。
 circleGroup.beginTime = currentTimeLocal + duration * 0.3
 
 // 设置圆环路径变化动画
 let circlePathAnimation = CABasicAnimation(keyPath: "path")
 circlePathAnimation.fromValue = circleStartPath.cgPath
 circlePathAnimation.toValue = circleEndPath.cgPath
 
 // 设置圆环宽度变化动画,先变大,再变小。
 let circleLineWidthAnimation = CAKeyframeAnimation(keyPath: "lineWidth")
 circleLineWidthAnimation.values = [1.0, 4.0, 0.3]
 circleLineWidthAnimation.keyTimes = [0.0, 0.7, 0.9]
 
 // 将圆环的两个动画添加到动画组。
 circleGroup.animations = [circlePathAnimation, circleLineWidthAnimation]
 
 // 将动画添加到圆环图层。
 circleLayer.add(circleGroup, forKey: nil)
 //
 
 //
 // 循环创建三角形图层,并添加动画效果
 for i in 0..<6 {
 // 三角形的高
 let height = self.bounds.size.height / 2 + 12
 // 三角形底边长
 let width = self.bounds.size.width / 10
 
 // 绘制一个起始三角形路径
 let triangleStartPath = UIBezierPath()
 triangleStartPath.move(to: .zero)
 triangleStartPath.addLine(to: CGPoint(x: -1, y: -1))
 triangleStartPath.addLine(to: CGPoint(x: 1, y: -1))
 triangleStartPath.close()
 
 // 绘制一个完全展开的三角形路径
 let triangleMiddlePath = UIBezierPath()
 triangleMiddlePath.move(to: .zero)
 triangleMiddlePath.addLine(to: CGPoint(x: -width/2, y: -height))
 triangleMiddlePath.addLine(to: CGPoint(x: width/2, y: -height))
 triangleMiddlePath.close()
 
 // 绘制一个终了三角形路径
 let triangleEndPath = UIBezierPath()
 triangleEndPath.move(to: CGPoint(x: 0, y: -height))
 triangleEndPath.addLine(to: CGPoint(x: -width/2, y: -height))
 triangleEndPath.addLine(to: CGPoint(x: width/2, y: -height))
 triangleEndPath.close()
 
 // 绘制三角形图层
 let shapeLayer = CAShapeLayer()
 // 设置图层中心位置,很重要。
 shapeLayer.position = self.likeImageView.layer.position
 shapeLayer.fillColor = UIColor.red.cgColor
 // 将图层进行旋转。
 shapeLayer.transform = CATransform3DMakeRotation(CGFloat(Double.pi/3) * CGFloat(i), 0, 0, 1)
 
 self.layer.insertSublayer(shapeLayer, below: circleLayer)
 
 // 计算三角形图层的偏移时间
 currentTimeInSuper = self.layer.convertTime(CACurrentMediaTime(), from: nil)
 currentTimeLocal = shapeLayer.convertTime(currentTimeInSuper, from: self.layer)
 
 // 设置三角形的动画,由小变大再变小。
 let trianglePathAnimation = CAKeyframeAnimation(keyPath: "path")
 trianglePathAnimation.values = [triangleStartPath.cgPath, triangleMiddlePath.cgPath, triangleEndPath.cgPath]
 trianglePathAnimation.keyTimes = [0.0, 0.3, 0.7]
 trianglePathAnimation.duration = duration * 0.7
 trianglePathAnimation.beginTime = currentTimeLocal + duration * 0.3
 
 shapeLayer.add(trianglePathAnimation, forKey: nil)
 }
 //
 }else {
 // 取消点赞
 // 1. 将红色爱心逐渐缩小至原来的0.1倍,然后设置为不可见并恢复原尺寸大小。
 UIView.animate(withDuration: duration * 0.3, delay: 0, options: .curveEaseInOut) { [weak self] in
 self?.likeImageView.transform = CGAffineTransform(scaleX: 0.1, y: 0.1)
 } completion: { [weak self] (finished) in
 self?.likeImageView.alpha = 0
 self?.likeImageView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
 self?.isUserInteractionEnabled = true
 }
 }
 }
}

LikeView即是自定义的点赞视图,可纯代码创建,也可通过xib创建,同时支持设置动画执行时间duration。

调用的地方:


class ViewController: UIViewController {
 
 override func viewDidLoad() {
 super.viewDidLoad()
 view.backgroundColor = UIColor.black
 // 设置一个0.5秒的动画
 let likeView1 = LikeView(frame: CGRect(x: 110, y: 300, width: 50, height: 50))
 likeView1.duration = 0.5
 self.view.addSubview(likeView1)
 
 // 设置一个10秒的动画
 let likeView2 = LikeView(frame: CGRect(x: 240, y: 300, width: 50, height: 50))
 likeView2.duration = 10
 self.view.addSubview(likeView2)
 }
 
}

执行效果:

4. 结束语

代码中主要用到了:UIView基础动画、CGAffineTransform、CATransform3D、UIBezierPath、CAShapeLayer、CAKeyframeAnimation、CABasicAnimation、CAAnimationGroup,另外还有beginTime的计算,也算是个小重点了。

以上只是仿照抖音点赞动画实现的功能,代码不多,但也不少,不知道抖音是具体怎么实现的,如果有什么不对的地方,或者可优化的地方,还请路过的朋友多多指点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: iOS实现抖音点赞动画效果

本文链接: https://www.lsjlt.com/news/30496.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • iOS实现抖音点赞动画效果
    本文实例为大家分享了iOS实现抖音点赞动画的具体代码,供大家参考,具体内容如下 1. 概述 最近看到抖音点赞爱心的动画效果比较好,出于好奇,自己也研究仿照动画效果写了一个,不喜欢的朋...
    99+
    2022-05-31
    iOS 抖音 点赞
  • Flutter实现抖音点赞效果
    目录效果图如下:分析效果思路实现1.对外公开的参数2.声明需要的对象3.手势的处理4.动画小红心的布局5.小红心动效使用效果源码效果图如下: 分析效果 1.整个控件可以点击,控件...
    99+
    2022-11-12
  • iOS实现抖音点赞功能
    目录前言实现原理三角形的贝塞尔曲线原理代码实现创建 CAShapeLayer创建初始位置的贝塞尔path结束前言 很多人肯定都是玩过抖音的吧,那也肯定为了某位美女或者帅哥偷偷作死的点...
    99+
    2022-11-13
  • iOS实现点赞动画特效
    本文实例为大家分享了iOS实现点赞动画特效的具体代码,供大家参考,具体内容如下 动画的基本使用 动画的实现基本上是基于对View控件和View的layer属性进行操作,对视图进行移动...
    99+
    2022-06-05
    iOS 点赞
  • iOS仿抖音视频加载动画效果的实现方法
    前言 这几天一直跟开源的抖音demo斗智斗勇,今天跟大家分享的是抖音中或者快手中加载视频的动画,这个加载效果还是挺实用,下面话不多说了,来随着小编一起学习学习吧 上图看成品 实现...
    99+
    2022-05-22
    视频 加载 动画
  • Android怎么实现点赞动画效果
    今天小编给大家分享一下Android怎么实现点赞动画效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前言对接下来功能实...
    99+
    2023-06-29
  • 使用Vue transition 实现点赞动画效果
    要实现点赞动画效果,你可以使用Vue的过渡(transition)组件。下面是一个简单的示例代码:```html<templa...
    99+
    2023-09-21
    Vue
  • iOS实现图片抖动效果
    本文实例为大家分享了iOS实现图片抖动效果的具体代码,供大家参考,具体内容如下 效果图: 核心代码: // // ViewController.m // 图标抖动 // // ...
    99+
    2022-05-28
    iOS 图片抖动
  • 通过JetpackCompose实现双击点赞动画效果
    目录实现步骤先红色画个爱心点击事件加动画完整代码效果图实现步骤 先红色画个爱心 Icon( Icons.Filled.Favorite, "爱心", Modi...
    99+
    2022-11-13
  • Vue transition实现点赞动画效果的示例
    目录效果一览爱心效果 数字滚动动画 点赞动画 效果一览 爱心效果 材料:爱心图标两个,没有我这种 icon 组件的用 png 图片代替 <transition :nam...
    99+
    2022-11-12
  • Android实现仿今日头条点赞动画效果实例
    目录一、前言二、需求拆分三、实现方案1、点赞控件触摸事件处理2、点赞动画的实现2.1、点赞效果图片的获取和存储管理2.2、点赞表情图标动画实现2.3、点赞次数和点赞文案的绘制3、存放...
    99+
    2022-11-13
  • 如何通过Jetpack Compose实现双击点赞动画效果
    这篇文章主要介绍如何通过Jetpack Compose实现双击点赞动画效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实现步骤先红色画个爱心Icon(    Ico...
    99+
    2023-06-28
  • Android实现点赞动画(27)
    本文实例为大家分享了Android使用入门第二十七篇点赞动画的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.like...
    99+
    2022-06-06
    动画 Android
  • 利用Android实现一种点赞动画效果的全过程
    目录前言点击后的缩放效果拇指的散开效果示例总结前言 最近有个需求,需要仿照公司的H5实现一个游戏助手,其中一个点赞的按钮有动画效果,如下图: 分析一下这个动画,点击按钮后,拇指首先...
    99+
    2022-12-08
    android 点赞动画 android点赞效果 android点击动画
  • Android实现简单点赞动画
    本文实例为大家分享了Android实现简单点赞动画的具体代码,供大家参考,具体内容如下 思路 1、找到Activity中DecorView的RootView 2、确定点赞控件位于屏幕...
    99+
    2022-11-12
  • iOS实现数字倍数动画效果
    前言 一个简单的利用 透明度和 缩放 实现的 数字倍数动画 效果图: 实现思路 上代码 看比较清晰 // 数字跳动动画 - (void)labelDanceAnimatio...
    99+
    2022-06-05
    ios 倍数 动画
  • iOS的GIF动画效果怎么实现
    本篇文章给大家分享的是有关iOS的GIF动画效果怎么实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。GIF在iOS中的使用场景  GIF在iOS中的使用场景有以下三个方面。&...
    99+
    2023-06-04
  • CSS动画:如何实现元素的抖动效果
    CSS动画:如何实现元素的抖动效果摘要:CSS动画是网页设计中常用的一种效果,它能够为网页增加动态和生动的感觉。本文将介绍如何使用CSS动画实现元素的抖动效果,并附上具体的代码示例供参考。引言在网页设计中,动画效果能够吸引用户的注意力,增加...
    99+
    2023-11-21
    CSS动画 元素 抖动效果
  • CSS如何实现点赞效果心形效果
    小编给大家分享一下CSS如何实现点赞效果心形效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! CSS实现点赞效果心形效果 <!DOCTYPE html> <htm...
    99+
    2022-10-19
  • PHP+Redis怎么实现点赞效果
    这篇文章主要介绍“PHP+Redis怎么实现点赞效果”,在日常操作中,相信很多人在PHP+Redis怎么实现点赞效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP+Redis怎么实现点赞效果”的疑惑有所...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作