七夕快到了,用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

不错不错!

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


相关文章
|
2月前
|
移动开发 JavaScript 前端开发
分享46个JS时间轴特效,总有一款适合您
分享46个JS时间轴特效,总有一款适合您
89 2
|
2月前
|
前端开发 JavaScript Python
分享76个文字特效,总有一款适合您
分享76个文字特效,总有一款适合您
34 5
|
2月前
|
移动开发 前端开发 JavaScript
分享88个文字特效,总有一款适合您
分享88个文字特效,总有一款适合您
23 1
|
6月前
|
Java Python
星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来
星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来
|
1月前
超简单的html+css魔幻霓虹灯文字特效
超简单的html+css魔幻霓虹灯文字特效
13 3
超简单的html+css魔幻霓虹灯文字特效
|
3月前
|
移动开发 JavaScript 前端开发
分享66个JS时间轴特效,总有一款适合您
分享66个JS时间轴特效,总有一款适合您
75 0
|
4月前
十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!(三)
十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
|
4月前
|
小程序 程序员
十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!(一)
十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
|
4月前
|
前端开发
HTML+CSS制作七夕跳动的红心动画效果
HTML+CSS制作七夕跳动的红心动画效果
|
5月前
|
iOS开发
水波涟漪,使用SwiftUI做一个仿iPhone隔空投送动画~
水波涟漪,使用SwiftUI做一个仿iPhone隔空投送动画~
68 0