IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Swift 动画 —— Facebook 点赞动画 -> 正文阅读

[移动开发]Swift 动画 —— Facebook 点赞动画

新建一个Swift工程。然后首先要做的就是画出动画的曲线。

画曲线

新建一个CurvedView 类

  class CurvedView: UIView {
        override func draw(_ rect: CGRect) {
            
        }
    }

然后在viewDidLoad中创建一个CurvedView对象并且添加到view上。

   let curvedView = CurvedView(frame: view.frame)
        curvedView.backgroundColor = .yellow
        view.addSubview(curvedView)

接下来要画曲线,先画两个点后运行,发现是一条很细的直线。

  override func draw(_ rect: CGRect) {
            let path = UIBezierPath()
            
            path.move(to: CGPoint(x: 0, y: 200))
            let endPoint = CGPoint(x: 200, y: 200)
            path.addLine(to:endPoint)
            path.stroke()
            
        }

在这里插入图片描述
接下来要用到addCurve,在苹果官方文档中说到,此方法将当前点的三次贝塞尔曲线附加到终点参数指定的终点。这两个控制点定义了线段的曲率。看起来晕头转向的,写完代码后运行看的比较直观。

override func draw(_ rect: CGRect) {
            let path = UIBezierPath()
            
            path.move(to: CGPoint(x: 0, y: 200))
            let endPoint = CGPoint(x: 450, y: 200)
            path.lineWidth = 3
            let cp1 =  CGPoint(x: 100, y: 100)
            let cp2 =  CGPoint(x: 200, y: 300)
            path.addCurve(to: endPoint, controlPoint1: cp1, controlPoint2: cp2)
            path.stroke()
            
        }

在这里插入图片描述

2. 添加动画

把画的UIBezierPath分离成一个方法,这样就方便我们使用

func customPath() -> UIBezierPath {
    let path = UIBezierPath()
    
    path.move(to: CGPoint(x: 0, y: 200))
    let endPoint = CGPoint(x: 450, y: 200)
    path.lineWidth = 3
    let cp1 =  CGPoint(x: 100, y: 100)
    let cp2 =  CGPoint(x: 200, y: 300)
    path.addCurve(to: endPoint, controlPoint1: cp1, controlPoint2: cp2)
    path.stroke()
    return path
}

class CurvedView: UIView {
    override func draw(_ rect: CGRect) {
        let path = customPath()
        path.lineWidth = 3
        path.stroke()
        
    }
}

添加一张图片,并且将刚才的path赋值给animation,设置好动画时长等,然后将动画添加给图片。

        let imageView = UIImageView(image: UIImage(named: "heart"))
        imageView.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
        let animation  = CAKeyframeAnimation(keyPath: "position")
        animation.path = customPath().cgPath
        animation.duration = 2
        animation.isRemovedOnCompletion = true
        animation.fillMode = .forwards
        animation.timingFunction = CAMediaTimingFunction(name: .easeOut)
        imageView.layer.add(animation, forKey: nil)
        view.addSubview(imageView)

接下来使用drand48给图片一个随机的大小。20 - 30

  let dimension = 20 + drand48() * 10
   imageView.frame = CGRect(x: 0, y: 0, width: dimension, height: dimension)

为view 添加一个手势

 view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))

每次点击都生成十个imageView。

   @objc func handleTap() {
        (0...10).forEach { (_) in
            generateAnimatedViews()
        }
    }
    func generateAnimatedViews() {
        
        let imageView = UIImageView(image: UIImage(named: "heart"))
        let dimension = 20 + drand48() * 10
        imageView.frame = CGRect(x: 0, y: 0, width: dimension, height: dimension)
        let animation  = CAKeyframeAnimation(keyPath: "position")
        animation.path = customPath().cgPath
        animation.duration = 2
        animation.isRemovedOnCompletion = true
        animation.fillMode = .forwards
        animation.timingFunction = CAMediaTimingFunction(name: .easeOut)
        imageView.layer.add(animation, forKey: nil)
        view.addSubview(imageView)
    }

到这里有个问题就是每个图片的path都是一样的,所以会叠加到一起,所以需要调整一下path。
在customPath方法中给cp1 和cp2添加随机性。

   let randomYShift = 200 +  drand48() * 300
    let cp1 =  CGPoint(x: 100, y: 100 -  randomYShift)
    let cp2 =  CGPoint(x: 200, y: 300 + randomYShift)

这里又发现了一个问题就是所有的图片都在一个X上面,这是因为它们的动画时长都一样,所以需要给动画时长页添加一点随机性。
在generateAnimatedViews方法中修改:

 animation.duration = 2 + drand48() * 3

为了图片随机,在generateAnimatedViews方法中修改:

 let image = drand48() > 0.5 ? UIImage(named: "heart") :  UIImage(named: "thumbs_up")
  let imageView =  UIImageView(image: image)

结束。完整代码如下:
在这里插入图片描述
在这里插入图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:58:23  更:2021-10-04 12:59:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:29:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码