摘要: 皮肤滚动条(SkinScrollBarUI)完整解析 一、滚动条在皮肤中的配置方式 千千静听的皮肤中,滚动条并不是通过窗口内部的 <scrollbar> 标签来定义的,而是通过独立的图片资源 + 可选的 XML 配置来实现皮肤化。通常,皮肤包(.skn)中会包含以下图片(命名约定): scroll_ 阅读全文
posted @ 2026-08-28 14:59 tomj2ee 阅读(9) 评论(0) 推荐(0)
摘要: 从零开发千千静听:分步指南与技术难点全记录 如果你也想手搓一个复古播放器,这份清单帮你避开我踩过的所有坑。 在经历了皮肤拆解、SkinWindow 源码分析之后,你已经有了理论储备。但真正动手开发时,依然会碰到大量“意料之外”的问题。本文将从零开始,给出一个完整的开发步骤,并在每一步标注出核心难点和 阅读全文
posted @ 2026-08-28 14:59 tomj2ee 阅读(23) 评论(0) 推荐(0)
摘要: MiniWindow 源码完整深度剖析 一、概述 MiniWindow 是千千静听(TTPlayer)的迷你模式窗口,它继承自 SkinWindow,利用同一份皮肤资源(mini_window 窗口定义)构建出一个紧凑版的播放器界面。迷你窗口通常用于将播放器缩小到屏幕角落,仅保留最核心的控制功能(播 阅读全文
posted @ 2026-08-28 14:02 tomj2ee 阅读(23) 评论(0) 推荐(0)
摘要: 我们先从千千静听(TTPlayer)的 LED 显示机制讲起,包括它在皮肤 XML 中的定义方式,然后对 TtLed 这个类的源码进行逐行、深度剖析。 第一部分:千千静听的 LED 显示是什么? 1. 视觉风格与用途 在千千静听中,LED 显示指的是主窗口中间那块模拟老式数码管(VFD 荧光显示或 阅读全文
posted @ 2026-08-28 13:15 tomj2ee 阅读(14) 评论(0) 推荐(0)
摘要: PlaylistWindow 播放列表窗口源码完整分解 PlaylistWindow 是 TTPlayer 中负责管理播放列表的核心窗口,继承自 SkinWindow,因此拥有皮肤背景、九宫格缩放、自定义边框等能力。它包含左侧的播放列表切换列表和右侧的歌曲列表,支持添加、删除、排序、查找、播放模式切 阅读全文
posted @ 2026-08-28 12:25 tomj2ee 阅读(16) 评论(0) 推荐(0)
摘要: LRCParser 源码完整分析 LRCParser 是用于解析 LRC(歌词)文件的工具类,支持标准 LRC 格式([mm:ss.xx] 时间标签)、增强型 LRC(逐词卡拉 OK,通过 <时间戳> 标记)、ID3 元信息标签([ti:], [ar:] 等),并具备自动字符集检测功能,以正确处理 阅读全文
posted @ 2026-08-28 12:12 tomj2ee 阅读(17) 评论(0) 推荐(0)
摘要: PlayerEngine 源码完整分析 一、概述 PlayerEngine 是音频播放引擎,使用 JavaCV 封装的 FFmpeg 进行解码,通过 javax.sound.sampled.SourceDataLine 输出音频。它支持播放/暂停/停止、Seek、音量控制、静音、均衡器(Equali 阅读全文
posted @ 2026-08-28 12:03 tomj2ee 阅读(8) 评论(0) 推荐(0)
摘要: SkinSelectDialog 皮肤切换代码完整解析 SkinSelectDialog 是 TTPlayer 的皮肤选择对话框,它扫描可用的皮肤资源,以列表 + 预览图的形式展示,并允许用户切换皮肤。切换逻辑主要围绕 selectedSkinSpec 字段展开——当用户点击“切换”按钮时,将选中的 阅读全文
posted @ 2026-08-28 11:53 tomj2ee 阅读(9) 评论(0) 推荐(0)
摘要: 歌词窗口(LyricWindow)完整解析 一、皮肤 XML 中的定义 LyricWindow 对应皮肤文件中的 <lyric_window> 节点。与 <main_window>、<mini_window> 类似,它定义了一个独立的窗口,专门用于显示滚动歌词。 1.1 典型 XML 结构 <lyr 阅读全文
posted @ 2026-08-28 11:45 tomj2ee 阅读(16) 评论(0) 推荐(0)
摘要: SkinWindow 不规则窗口处理详细解析 SkinWindow 是千千静听所有皮肤窗口的基类,它实现了基于背景图片的不规则窗口(又称异形窗口)的核心机制。不规则窗口允许窗口形状与背景图片的轮廓一致,透明区域(通常是洋红色)会被镂空,并且鼠标点击透明区域时事件会穿透到底层窗口。这种效果在经典播放器 阅读全文
posted @ 2026-08-28 11:42 tomj2ee 阅读(11) 评论(0) 推荐(0)
摘要: 好的,我们先从千千静听(TTPlayer)的音量控件讲起,包括它在皮肤 XML 中的定义方式,然后对 TtVolumeBar 这个类的源码进行逐行、深度剖析。 第一部分:千千静听的音量控件是什么? 1. 功能与视觉 在千千静听主窗口中,音量控制通常是一条水平滑块(Slider),位于播放控制按钮附近 阅读全文
posted @ 2026-08-28 11:42 tomj2ee 阅读(12) 评论(0) 推荐(0)
摘要: 我们先从千千静听(TTPlayer)频谱可视化在皮肤 XML 中的定义方式讲起,然后对 TtVisualizer 这个类的源码进行完整的深度剖析。 第一部分:频谱可视化在皮肤 XML 中的定义 1. XML 标签与属性 在 TTPlayer 的 Skin.xml 中,频谱显示区域通常使用 <visu 阅读全文
posted @ 2026-08-28 11:20 tomj2ee 阅读(11) 评论(0) 推荐(0)
摘要: 好的,我们先来深度解析 TtButton 这个类的源码实现,然后结合千千静听(TTPlayer)经典的皮肤 UI 布局,为你详细列举它到底有哪些按钮。 第一部分:TtButton 源码深度解析 这个类继承自 JComponent,是一个自定义轻量级按钮组件,它完全使用图像绘制,不依赖 Swing 原 阅读全文
posted @ 2026-08-28 10:56 tomj2ee 阅读(25) 评论(0) 推荐(0)
摘要: 窗口吸附(Window Snapping)完整技术解析与 SnapUtils 源码深度剖析 第一部分:什么是窗口吸附? 1.1 概念定义 窗口吸附(Window Snapping) 是一种桌面应用程序的交互设计,指当用户用鼠标拖动一个窗口靠近另一个窗口时,被拖动的窗口会自动“跳”到目标窗口的边缘并与 阅读全文
posted @ 2026-08-28 10:56 tomj2ee 阅读(15) 评论(0) 推荐(0)
摘要: 源码深度解剖:SkinWindow —— 支撑千千静听所有窗口的“骨骼系统” 从BMP解码到九宫格拉伸,从边缘拖拽到控件自适应——这一个基类,撑起了8个窗口的整片天空。 在上一期,我们把官方 skin.xml 拆得干干净净,搞懂了每一个坐标、每一个图片的含义。但XML只是一份“蓝图”,真正让这些坐标 阅读全文
posted @ 2026-08-28 10:23 tomj2ee 阅读(23) 评论(0) 推荐(0)
摘要: TtSkin 类代码分析 1. 概述 TtSkin 是用于加载和解析千千静听(TTPlayer)皮肤文件(.skn 格式)的 Java 工具类。它支持从文件、目录或 Classpath 资源中读取皮肤包,解析其中的 XML 描述文件(Skin.xml),提取窗口、控件的位置、图片、尺寸、颜色等配置信 阅读全文
posted @ 2026-08-28 10:14 tomj2ee 阅读(21) 评论(0) 推荐(0)
摘要: 第一乐章深度拆解:当Swing遇上千千静听真实皮肤XML —— 从官方Skin到JVM像素级还原 拆开一个.skin文件,里面藏着的是一份完整的UI蓝图;我们用Java Swing把它变成可交互的播放器。 这份XML定义了多达8个独立窗口/面板:主播放器、歌词秀、均衡器、播放列表、迷你模式、浏览器、 阅读全文
posted @ 2026-08-28 10:13 tomj2ee 阅读(19) 评论(0) 推荐(0)
摘要: TTPlayer — 千千静听复刻版 / TTPlayer 截图 / **实际运行截图 中文 一款用 Java Swing 编写的桌面音乐播放器,致敬经典 千千静听 (TTPlayer)。支持本地音频播放、同步歌词、多皮肤切换、均衡器、频谱可视化等功能。界面支持中文 / English / 日本語 阅读全文
posted @ 2026-08-28 10:11 tomj2ee 阅读(183) 评论(0) 推荐(0)