七夕快到了,用SwiftUI做一个表达爱意的心形动画

简介: 传统的七夕快到了,作为一个程序猿,最浪漫的礼物当然是自己写的啦!思来想去也不知道写什么好,在某天在某音上学习时看到点赞的动画效果还不错,那不如就做一个表达爱意的动画吧。

传统的七夕快到了,作为一个程序猿,最浪漫的礼物当然是自己写的啦!

思来想去也不知道写什么好,在某天在某音上学习时看到点赞的动画效果还不错,那不如就做一个表达爱意动画吧。

说干就干。

项目搭建

首先,创建一个新的SwiftUI项目,命名为LoveAnimation

image.png

逻辑分析

我们先分析下整个点赞效果的逻辑,当我们点击“白色爱心”时,会冒出很多“红色爱心”出来,并且呈现的效果是出现后向上随机散开后消失

如果我们需要实现这个效果,那么不妨设想下实现过程,先有一个“白色爱心”,然后使用ZStack层叠视图覆盖一层“红色爱心”,当点击“白色爱心”时触发交互动画,“红色爱心”在出现时增加交互效果,实现向上随机散开消失

页面样式

页面样式部分,我们可以创建两个心形视图。示例:

struct ContentView: View {
    @State var loveCount = 0
    func TapAction() {
        loveCount += 1
    }
    var body: some View {
        ZStack {
            Color.black.ignoresSafeArea()
            VStack(alignment: .center, spacing: 40) {
                ZStack {
                    Image(systemName: "heart.fill")
                        .resizable()
                        .foregroundColor(.white)
                        .frame(width: 120, height: 120)
                        .padding()
                        .onTapGesture {
                            TapAction()
                        }
                    ForEach(0 ..< loveCount, id: \.self) { _ in
                        Image(systemName: "heart.fill")
                            .resizable()
                            .frame(width: 120, height: 120)
                            .padding()
                    }
                }
                Text("我喜欢你")
                    .font(.largeTitle)
                    .foregroundColor(.white)
            }
        }
    }
}
复制代码

image.png

上述代码中,我们声明了一个变量loveCount来存储心形的数量,然后定义了一个方法TapAction,当我们点击的时候,loveCount心形数量增加。

样式部分我们将背景变成黑色,然后绘制了一个白色的心形,再使用ZStack包裹了一个红色的心形,当白色的心形点击时,调用TapAction方法。

初步的样式就完成了。

动画逻辑

页面比较简单,我们接下来完成动画逻辑部分。

import SwiftUI
struct LoveGeometryEffect : GeometryEffect {
    var time : Double
    var speed = Double.random(in: 100 ... 200)
    var xDirection = Double.random(in:  -0.1 ... 0.1)
    var yDirection = Double.random(in: -Double.pi ...  0)
    var animatableData: Double {
        get { time }
        set { time = newValue }
    }
    func effectValue(size: CGSize) -> ProjectionTransform {
        let xTranslation = speed * xDirection
        let yTranslation = speed * sin(yDirection) * time
        let affineTranslation =  CGAffineTransform(translationX: xTranslation, y: yTranslation)
        return ProjectionTransform(affineTranslation)
    }
}
复制代码

image.png

上述代码中,我们创建了一个爱心动画LoveGeometryEffect,它遵循GeometryEffect协议。

我们首先声明了4个变量,分别是时间time速度speedX轴出现的位置xDirectionY轴出现的位置yDirection

其中,speed、xDirection、yDirection都使用随机数,这样我们就能实现线性出现的效果,不至于那么死板。

然后使用get、set属性,在获得time初始值时,调用了get属性计算出的新值。

最后我们定义了一个方法effectValue返回一个ProjectionTransform投影转换效果,来实现红色爱心移动效果

视图修饰符

有了交互动画逻辑后,我们可以创建一个视图修饰符,用于之后修饰我们的红色爱心视图。示例:

import SwiftUI
struct LoveTapModifier: ViewModifier {
    @State var time = 0.0
    let duration = 1.0
    func body(content: Content) -> some View {
        ZStack {
            content
                .foregroundColor(.red)
                .modifier(LoveGeometryEffect(time: time))
                .opacity(time == 1 ? 0 : 1)
        }
        .onAppear {
            withAnimation (.easeOut(duration: duration)) {
                self.time = duration
            }
        }
    }
}
复制代码

image.png

上述代码中,我们创建了一个视图修饰LoveTapModifier,它的内容包含设置视图的填充色红色,并使用之前创建好的LoveGeometryEffect动画进行修饰。

为了让红色爱心出现后跟随时间逐渐消失,我们使用opacity修饰符,让视图跟随时间慢慢隐藏

效果呈现

完成后,我们将LoveTapModifier修饰符作用在红色心形视图上。示例:

.modifier(LoveTapModifier())
复制代码

image.png

image.png

不错不错!

赶紧发给喜欢的女生,收一张好人卡先。


相关文章
|
6月前
|
前端开发 JavaScript Python
分享76个文字特效,总有一款适合您
分享76个文字特效,总有一款适合您
74 5
|
6月前
|
移动开发 前端开发 JavaScript
分享88个文字特效,总有一款适合您
分享88个文字特效,总有一款适合您
77 1
|
5月前
|
前端开发 开发工具 图形学
【你问我答】unity实现一个刮刮乐效果
【你问我答】unity实现一个刮刮乐效果
128 0
|
6月前
超简单的html+css魔幻霓虹灯文字特效
超简单的html+css魔幻霓虹灯文字特效
51 3
超简单的html+css魔幻霓虹灯文字特效
|
iOS开发
水波涟漪,使用SwiftUI做一个仿iPhone隔空投送动画~
水波涟漪,使用SwiftUI做一个仿iPhone隔空投送动画~
163 0
|
前端开发 JavaScript
2023跨年烟花(浪漫烟花+美妙音乐+雪花飘飘)含前端源码直接下载---系列最终篇
2023跨年烟花(浪漫烟花+美妙音乐+雪花飘飘)含前端源码直接下载---系列最终篇
481 0
2023跨年烟花(浪漫烟花+美妙音乐+雪花飘飘)含前端源码直接下载---系列最终篇
逐帧动画案例(奔跑的小人)
逐帧动画案例(奔跑的小人)
240 0
逐帧动画案例(奔跑的小人)
|
Web App开发 移动开发 前端开发
除夕用不同的语言编写绚丽的烟花
一: 简单Html先来一个简单的形象实现烟花(绝对绚丽) 先看效果 源码 &lt;!DOCTYPE html&gt; &lt;html lang=&quot;zh&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot;&gt; &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge,chrome=1&quot;&gt; &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt; &lt;title&gt;html5 canvas除夕烟花&lt;/title&gt;&lt;base target=&quot;_blank&quot; /&gt; &lt;link rel
106 0
除夕用不同的语言编写绚丽的烟花
R 可视乎 | 绘制卡通圣诞树
先和大家说一句圣诞快乐呀,最近 DIY 涂鸦圣诞树非常受欢迎,小编琢磨着能否用 R 语言来绘制一颗圣诞树呢,最后终于让小编找到了教程[1],这不赶紧在今天分享出来给大家,一起动手试一试吧~
270 0
R 可视乎 | 绘制卡通圣诞树
|
算法 Shell 索引
用粒子动画来忆起你的春节时光 | 支持表情文字
用粒子动画来忆起你的春节时光 | 支持表情文字
132 0
用粒子动画来忆起你的春节时光 | 支持表情文字