好的,设计灵感已确定!将采用黑色背景 + 绿色科技感水印风格,类似矩阵/监控系统效果。现在我来创建完整的 Android Studio 项目结构(Gradle + Java)。
现在创建一个直观的项目结构说明文件,帮助用户快速了解整个项目:
完整的 Android Studio(Gradle + Java)项目已创建完毕,位于 android-timestamp-watermark/ 目录。
TimestampWatermark/
├── settings.gradle
├── build.gradle
├── gradle.properties
└── app/
├── build.gradle ← compileSdk 34, minSdk 26
├── proguard-rules.pro
└── src/main/
├── AndroidManifest.xml ← 所有权限声明
├── java/com/example/timestampwatermark/
│ ├── WatermarkView.java ← 核心:Canvas 绘制滚动水印
│ ├── WatermarkService.java ← 前台 Service + WindowManager
│ ├── MainActivity.java ← 控制面板 UI
│ ├── BootReceiver.java ← 开机自启
│ └── PermissionActivity.java ← 透明权限跳转
└── res/
├── layout/activity_main.xml ← 科技感深色控制界面
├── values/themes.xml ← 深色 + 科技绿主题
├── values/colors.xml
├── values/strings.xml
└── drawable/pulse_dot.xml| 特性 | 实现细节 |
|---|---|
| 不拦截触摸 | FLAG_NOT_TOUCHABLE + FLAG_NOT_FOCUSABLE,水印完全穿透 |
| 精确到毫秒 | SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"),50ms 刷新 |
| 斜向无限滚动 | Canvas.rotate(-25°) + 每帧 offset 取模,无缝循环 |
| 全局覆盖 | TYPE_APPLICATION_OVERLAY 系统最顶层 |
| 防回收 | 前台 Service + 通知常驻 + 开机自启 |
| 毫秒高亮 | 主时间戳绿色 alpha=55,毫秒部分 alpha=85 更亮 |
android-timestamp-watermark/ 文件夹国产 ROM(MIUI、ColorOS 等)还需在「自启动管理」中额外允许本 App 自启。
思路清晰了。需要做以下改动:
MainActivity - 改为:有权限 → 直接启动 Service 然后 finish(),无权限 → 显示最简授权 UIWatermarkService - 通知点击不再跳回主界面(因为主界面 finish 了),改成只有关闭按钮AndroidManifest - 去掉 PermissionActivity(合并进 MainActivity)现在更新 WatermarkService 的通知,去掉跳转 MainActivity 的点击(因为它已经 finish 了),通知只保留「关闭水印」动作:
现在删除不再使用的文件(PermissionActivity.java、activity_main.xml):
完成。以下是改动总结:
改动内容:
| 文件 | 变更 |
|---|---|
MainActivity.java | 完全重写:onCreate 先检查权限,有权限直接 startForegroundService() + finish();无权限则用纯代码构建一个极简授权 UI,onResume 返回时自动再次检测,权限到位立即启动并退出 |
WatermarkService.java | 通知不再指向 MainActivity(已 finish),点击通知本身和操作按钮都发送 ACTION_STOP 关闭水印 |
AndroidManifest.xml | 移除 PermissionActivity 声明,MainActivity 不再使用透明主题 |
PermissionActivity.java | 已删除(功能合并进 MainActivity) |
activity_main.xml | 已删除(界面改为纯代码构建,无需 XML) |
整体流程: 安装后点图标 → 有权限则水印立即出现、界面自动关闭 → 无权限则显示黑底绿字授权页 → 用户授权返回后 onResume 自动检测、无感启动水印并退出。
You can send messages while the preview loads