# Birthday **Repository Path**: crystal-l/birthday ## Basic Information - **Project Name**: Birthday - **Description**: 刘亦菲生日快乐祝福 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-07 - **Last Updated**: 2026-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 刘亦菲0825生日快乐 🎂 ![生日截图](生日截图.png) ![温馨截图](温馨截图.png) ![前端截图](生日截图前端.png) 一个桌面 & 网页双平台的刘亦菲生日祝福应用。包含 **生日祝福版(Birthday)**、**温暖问候版(App)** 和 **前端网页版**(体验网址:https://www.61lyf.top/Birthday/index.html ) 三个版本。 ## ✨ 功能特色 ### 生日祝福版(Birthday.java) - **爱心形状布局**:99 个祝福弹窗沿心形曲线依次排列 - **图文分离**:每张祝福卡片顶部为背景图片,底部为文字,互不遮盖 - **150 条祝福语**:内置丰富的生日祝福语句 - **21 张背景图片**:随机搭配,图文分离不遮盖 - **薰衣草紫色主题**:梦幻浪漫的配色 - **屏幕自适应**:窗口高度根据屏幕尺寸自动调整 - **爱心居中偏上**:爱心整体上移 8% 显示 - **一键收下**:「收下全部」按钮一键关闭所有祝福 - **重新开启**:关闭后可通过「重新开启」按钮再次生成爱心祝福 - **个性关闭**:每个祝福窗口可单独点击「收下」关闭 - **无背景大图**:祝福卡片直接在桌面上显示 ### 温暖问候版(App.java) - **温暖治愈主题**:蓝粉柔和配色,温暖人心 - **60 条温暖语**:内置治愈系语句,给人力量 - **一箭双心布局**:99 个温暖卡片排列成「一箭穿双心」图案,占满整个屏幕 - **爱心参数方程**:左心 30 个 + 右心 30 个 + 箭线 39 个 = 99 个弹窗 - **无边框气泡**:动态尺寸宽扁卡片,像便签纸 - **20 种柔和背景**:马卡龙色系随机搭配 - **「悄悄溜走」按钮**:温柔告别方式 - **收下全部**:爱心按钮一键关闭所有窗口 - **个性收下**:每个温暖卡片可单独点击「收下」关闭 - **屏幕自适应**:窗口尺寸和图案大小均根据屏幕动态调整 - **适合日常问候**:非生日场景也能使用 ### 网页版(HTML/CSS/JS) - **背景图自适应**:背景图保持原始比例完整展示,不变形不裁剪 - **统一缩放系统**:所有覆盖元素以背景图原始尺寸为坐标系,等比缩放 - **音乐播放**:点击「生日快乐」后随机播放 vo/ 下的音乐 - **八种出现模式**:每次随机选择「中心生长」「随机位置」「顺时针曲线」「逆时针曲线」「涟漪扩散」「心跳节奏」「描边→填充」「雨落心形」八种模式之一 - **图文分离**:卡片顶部图片,底部文字,互不遮盖 - **双按钮同位置**:「收下全部」和「重新开启」共用右上角位置 - **商业声明**:页面底部显示「严禁商用」提示 - **重新开启**:支持重新开启爱心祝福和重播音乐 - **窗口缩放同步**:拖拽窗口缩放时所有元素实时同步调整 ### 通用功能 - **淡入淡出动画**:主窗口优雅淡入,点击后淡出并开启祝福 - **始终置顶**:所有祝福窗口自动保持在最前 ## 🛠️ 技术栈 ### 桌面版 - **语言**:Java - **UI 框架**:Java Swing(`javax.swing`) - **并发**:`ScheduledExecutorService` 定时调度窗口创建 - **动画**:`javax.swing.Timer` 实现透明度渐变 - **图形**:`java.awt` 绘制爱心形状、自定义面板 ### 网页版 - **HTML5**:页面结构 - **CSS3**:样式与动画 - **JavaScript**:交互逻辑、爱心参数方程、音乐播放 ## 📁 项目结构 ``` App/ ├── src/ # Java 桌面版源码 │ ├── Birthday.java # 生日祝福版(爱心布局 + 图文分离) │ ├── App.java # 温暖问候版(一箭双心布局 + 治愈文字) │ ├── META-INF/ │ │ └── MANIFEST.MF # JAR 清单文件 │ ├── img/ # 21 张背景图片 │ │ ├── image0.jpg ~ image20.jpg │ ├── vo/ # 4 首背景音乐 │ │ ├── 1.mp3 ~ 4.mp3 ├── Birthday/ # 前端网页版 │ ├── index.html # 页面结构 │ ├── style.css # 样式表(含缩放系统) │ ├── script.js # 交互脚本 + 爱心参数方程 │ ├── img/ # 图片资源(cat.jpg + 21 张背景图) │ └── vo/ # 4 首背景音乐 ├── out/artifacts/App_jar/ │ └── 茜茜生日快乐.jar # 已构建的可执行 JAR ├── dist/ │ └── 茜茜生日快乐.app/ # macOS 应用包 ├── 知识库.md # 技术知识点文档 ├── push.sh # Git 一键推送到 Gitee + GitHub └── App.iml # IntelliJ IDEA 项目配置 ``` ## 🚀 运行方式 ### 桌面版(Java) #### 生日祝福版 ```bash # 编译 javac -d out src/Birthday.java # 运行 java -cp out Birthday ``` #### 温暖问候版 ```bash # 编译 javac -d out src/App.java # 运行 java -cp out App ``` #### 运行 JAR ```bash java -jar "out/artifacts/App_jar/茜茜生日快乐.jar" ``` #### 运行 macOS 应用 ```bash open "dist/茜茜生日快乐.app" ``` #### IntelliJ IDEA 1. 用 IntelliJ IDEA 打开项目 2. 找到 `src/Birthday.java` 或 `src/App.java` 3. 右键 → Run ### 网页版(HTML/CSS/JS) #### 本地服务器 ```bash cd Birthday python3 -m http.server 8000 # 浏览器访问 http://localhost:8000 ``` #### 直接打开 双击 `Birthday/index.html` 在浏览器中打开 #### 部署到 WordPress 1. 将 `Birthday/` 文件夹上传到 WordPress 根目录 2. 使用自定义 HTML 区块或页面模板引入 3. 访问对应页面即可 ## 🎨 主题定制 ### 生日祝福版(Birthday.java) #### 修改祝福语 编辑 `BIRTHDAY_WISHES` 数组(约第 34-160 行),替换或新增祝福语。 #### 修改主界面文字 编辑 `FIRST_TEXT` 常量(约第 260 行),自定义标题内容。 #### 修改主题配色 | 常量 | 说明 | 默认值 | |------|------|--------| | `FIRST_WIN_BG` | 主窗口背景 | 薰衣草 `(238, 230, 250)` | | `FIRST_FRAME_BG` | 内容区背景 | 紫白 `(248, 240, 255)` | | `FIRST_TEXT_COLOR` | 文字颜色 | 紫色 `(138, 43, 226)` | | `BUTTON_BG` | 按钮背景 | 浅紫 `(221, 214, 243)` | | `BUTTON_FG` | 按钮文字 | 深紫 `(75, 0, 130)` | #### 修改爱心布局参数 ```java private static final int TIP_COUNT = 99; // 祝福窗口数量 private static final long TIP_INTERVAL = 450; // 弹出间隔(毫秒) int centerY = screenSize.height / 2 - (int)(screenSize.height * 0.08); // 爱心上移比例 ``` ### 温暖问候版(App.java) #### 修改温暖语 编辑 `WARM_TEXT_LIST` 数组(约第 32-54 行),替换或新增治愈语句。 #### 修改主界面文字 编辑 `FIRST_TEXT` 常量(约第 79 行),自定义问候语。 #### 修改主题配色 | 常量 | 说明 | 默认值 | |------|------|--------| | `FIRST_WIN_BG` | 主窗口背景 | 浅蓝 `(224, 239, 251)` | | `FIRST_FRAME_BG` | 内容区背景 | 粉白 `(248, 215, 215)` | | `FIRST_TEXT_COLOR` | 文字颜色 | 豆沙粉 `(188, 136, 203)` | | `BUTTON_BG` | 按钮背景 | 金黄 `(255, 205, 89)` | | `BUTTON_FG` | 按钮文字 | 深红 `(173, 38, 57)` | | `CLOSE_BUTTON_BG` | 关闭按钮 | 珊瑚红 `(255, 107, 107)` | #### 修改窗口参数 ```java // 动态尺寸(根据屏幕大小自动调整) TIP_WIN_WIDTH = Math.max(240, (int)(screenSize.width * 0.18)); TIP_WIN_HEIGHT = Math.max(90, (int)(screenSize.height * 0.11)); private static final int TIP_COUNT = 99; // 卡片数量 private static final long TIP_INTERVAL = 500; // 弹出间隔(毫秒) ``` #### 修改一箭双心布局 ```java // computeArrowHeartPositions() 方法中的参数: int leftHeartCount = 30; // 左爱心弹窗数 int rightHeartCount = 30; // 右爱心弹窗数 int arrowCount = 39; // 箭线弹窗数 int padding = 20; // 屏幕边距 double heartScale = ... // 自动根据屏幕可用空间计算 ``` ### 网页版(Birthday/) #### 修改祝福语 编辑 `script.js` 中的 `wishes` 数组。 #### 修改主界面文字 编辑 `index.html` 中的主窗口文字。 #### 修改布局参数 ```javascript // script.js var TIP_COUNT = 99; // 祝福数量 var TIP_INTERVAL = 450; // 弹出间隔(毫秒) var WISH_W = 270; // 祝福弹窗宽度(基于背景图原始尺寸) var WISH_H_MIN = 120; // 祝福弹窗最小高度 ``` #### 缩放系统说明 网页版以 `cat.jpg` 的原始尺寸作为统一坐标系,所有覆盖元素(主窗口、祝福弹窗、按钮等)按此坐标系定位,整个覆盖层通过 `transform: scale()` 等比缩放到实际显示尺寸,确保在任何分辨率下元素与背景图的比例关系完全一致。 #### 爱心生成算法 `generateHeartPositions()` 每次随机选择八种模式之一: | 模式 | 函数 | 排序方式 | 视觉效果 | |------|------|---------|---------| | 中心生长 | `generateGrowthPositions` | 按到中心距离:近→远 | 从中心向两边绽放 | | 随机位置 | `generateRandomPositions` | Fisher-Yates 洗牌 | 爱心上随机依次出现 | | 顺时针曲线 | `generateCurveCwPositions` | t: 0→2π | 沿心形顺时针勾勒 | | 逆时针曲线 | `generateCurveCcwPositions` | t: 2π→0 | 沿心形逆时针勾勒 | | 涟漪扩散 | `generateRipplePositions` | 按距离分 4 环,环内逐个出现 | 一圈一圈如水波扩散 | | 心跳节奏 | `generateHeartbeatPositions` | lub-dub 间隔 | 按心跳节奏出现(150-150-500ms) | | 描边→填充 | `generateOutlineFillPositions` | 40% 描边→60% 填充 | 先勾勒心形再填充内部 | | 雨落心形 | `generateRainfallPositions` | 随机位置 + 下落动画 | 弹窗从上方掉落至心形位置 | 涟漪/心跳/描边填充/雨落模式支持自定义延迟(`delays` 数组),雨落模式额外支持 `rainfall` 标记和 `rainfallFallDistance` 下落距离。 #### 位置去重说明 心形参数方程在某些区域(如底部尖端)曲线密集经过,若启用去重逻辑会丢弃部分位置,导致 99 个祝福中有多个复用同一位置,视觉上出现"爱心只画了一半"的问题。因此所有模式均使用 `sampleHeartPoints(count, false)` 关闭去重,保证 99 个位置全部唯一。 ### 通用定制 #### 添加背景图片 将 PNG 图片放入对应版本的 `img/` 目录,然后修改 `IMAGE_COUNT` 常量。 #### 添加背景音乐 将 MP3 文件放入 `vo/` 目录,网页版会自动识别。 ## 📝 版本对比 | 特性 | 生日祝福版(Birthday) | 温暖问候版(App) | 网页版(Birthday/) | |------|----------------------|------------------|-------------------| | 入口类 | `Birthday.java` | `App.java` | `index.html` | | 主题 | 紫色梦幻生日 | 蓝粉治愈日常 | 紫色梦幻生日 | | 布局 | 爱心形状 | 一箭双心(占满屏幕) | 八种模式随机(生长/随机/顺时针/逆时针/涟漪/心跳/描边填充/雨落) | | 文案数量 | 150 条生日祝福 | 60 条温暖语 | 110 条生日祝福 | | 背景图片 | 21 张(图文分离) | 无(纯色气泡) | 21 张(图文分离) | | 窗口尺寸 | 180×动态高度 | 动态尺寸(屏幕自适应) | 背景图原始尺寸坐标系,等比缩放 | | 按钮文字 | 生日快乐 / 收下全部 | 悄悄溜走 / 收下全部 | 生日快乐 / 收下全部 | | 音乐播放 | 无 | 无 | 随机播放 vo/*.mp3 | | 窗口自适应 | 屏幕高度自适应 | 屏幕宽高自适应 | 跟随背景图等比缩放 | | 个性收下 | 每个祝福窗口「收下」 | 每个温暖卡片「收下」 | 每个卡片「收下」 | | 重新开启 | 支持 | 支持 | 支持 | ## 📦 打包构建 ### Java JAR 在 IntelliJ IDEA 中: 1. `File` → `Project Structure` → `Artifacts` 2. 添加 `Jar` → `From modules with dependencies` 3. 主类选择 `Birthday`(或 `App`) 4. `Build` → `Build Artifacts` 5. 在 `out/artifacts/` 下生成 JAR 文件 ### macOS .app ```bash jpackage --type app-image \ --name "茜茜生日快乐" \ --input out/artifacts/App_jar \ --main-jar "茜茜生日快乐.jar" \ --main-class Birthday \ --dest dist ``` ## 💡 扩展建议 - 可将 `img/` 目录中的图片替换为个性化照片 - 可将祝福文字改为朋友的名字和专属祝福语 - 温暖版可扩展为更多治愈主题(如每日一句) - 网页版可部署到云服务器(如 WordPress)分享给朋友 - 可添加更多背景音乐到 `vo/` 目录 - 可将爱心关闭按钮改为其他自定义形状 - 温暖版的一箭双心布局也可改为其他图案(如花朵、星星、双心等)