144 lines
3.9 KiB
Dart
144 lines
3.9 KiB
Dart
import 'package:flutter/material.dart';
|
||
|
||
/// 遥控模式 HUD(手动控制全屏视图)专用「浅色玻璃」配色。
|
||
///
|
||
/// 与 pv_control 普通态大屏的深蓝科技风 [PvColors] 完全不同:HUD 以视频铺底,
|
||
/// 上层控件全部是「近白半透明卡片 + 柔和投影 + 深墨蓝文字」,让画面不被压暗。
|
||
/// 这里独立维护一套常量,避免改动 PvColors 影响普通态页面。
|
||
class PvHudColors {
|
||
PvHudColors._();
|
||
|
||
// ===== 面板 =====
|
||
/// 卡片 / 面板底色(近白微透明,让视频透出一点层次)
|
||
static const Color panel = Color(0xF7FFFFFF);
|
||
|
||
/// 实白(顶栏 / 悬浮按钮)
|
||
static const Color panelSolid = Color(0xFFFFFFFF);
|
||
|
||
/// 面板描边(极淡冷灰)
|
||
static const Color border = Color(0x14203244);
|
||
|
||
/// 面板投影
|
||
static const Color shadow = Color(0x1F0E2233);
|
||
|
||
// ===== 文字 =====
|
||
/// 主文字(深墨蓝)
|
||
static const Color textPrimary = Color(0xFF10202E);
|
||
|
||
/// 次要文字
|
||
static const Color textSecondary = Color(0xFF6C7F8F);
|
||
|
||
/// 更弱的辅助文字
|
||
static const Color textTertiary = Color(0xFF9AAAB6);
|
||
|
||
// ===== 语义色 =====
|
||
/// 在线 / 正常 / 运行中 / RTK 固定解
|
||
static const Color success = Color(0xFF16B364);
|
||
|
||
/// 绿色浅底(状态胶囊)
|
||
static const Color successBg = Color(0xFFE8F8EF);
|
||
|
||
/// 蓝色:方向箭头、播放键
|
||
static const Color blue = Color(0xFF2F6BFF);
|
||
|
||
/// 蓝色浅底
|
||
static const Color blueBg = Color(0xFFEAF0FF);
|
||
|
||
/// 危险 / 障碍告警
|
||
static const Color danger = Color(0xFFFF3B4E);
|
||
|
||
/// 危险浅底(未在控制 / 异常状态胶囊)
|
||
static const Color dangerBg = Color(0xFFFDECEE);
|
||
|
||
/// 深色玻璃(摇杆底盘 / 视频浮窗底)
|
||
static const Color glassDark = Color(0xCC2A343D);
|
||
|
||
/// 药丸形控件背景(顶栏按钮、底部条按钮)
|
||
static const Color pill = Color(0xFFF1F4F7);
|
||
|
||
/// 标准卡片装饰:近白底 + 极淡描边 + 柔和投影
|
||
static BoxDecoration panelDeco({
|
||
double radius = 16,
|
||
Color? fill,
|
||
double blur = 18,
|
||
double alpha = 0.13,
|
||
}) {
|
||
return BoxDecoration(
|
||
color: fill ?? panel,
|
||
borderRadius: BorderRadius.circular(radius),
|
||
border: Border.all(color: border, width: 1),
|
||
boxShadow: [
|
||
BoxShadow(
|
||
color: shadow.withValues(alpha: alpha),
|
||
blurRadius: blur,
|
||
offset: const Offset(0, 4),
|
||
),
|
||
],
|
||
);
|
||
}
|
||
|
||
/// 胶囊控件装饰(无投影 / 轻投影)
|
||
static BoxDecoration pillDeco({
|
||
double radius = 14,
|
||
Color? fill,
|
||
bool shadowed = false,
|
||
}) {
|
||
return BoxDecoration(
|
||
color: fill ?? pill,
|
||
borderRadius: BorderRadius.circular(radius),
|
||
boxShadow: shadowed
|
||
? [
|
||
BoxShadow(
|
||
color: shadow.withValues(alpha: 0.1),
|
||
blurRadius: 10,
|
||
offset: const Offset(0, 2),
|
||
),
|
||
]
|
||
: null,
|
||
);
|
||
}
|
||
|
||
/// 绿色状态胶囊(「正常」「运行中」等)
|
||
static BoxDecoration successPill({double radius = 10}) {
|
||
return BoxDecoration(
|
||
color: successBg,
|
||
borderRadius: BorderRadius.circular(radius),
|
||
);
|
||
}
|
||
}
|
||
|
||
/// HUD 文本样式:深色墨蓝一套,交给各组件 copyWith(color:) 调色与缩字号。
|
||
class PvHudType {
|
||
PvHudType._();
|
||
|
||
/// 顶栏标题
|
||
static const TextStyle title = TextStyle(
|
||
color: PvHudColors.textPrimary,
|
||
fontSize: 17,
|
||
fontWeight: FontWeight.w800,
|
||
height: 1.2,
|
||
);
|
||
|
||
/// 卡片内的主数值
|
||
static const TextStyle value = TextStyle(
|
||
color: PvHudColors.textPrimary,
|
||
fontSize: 13,
|
||
fontWeight: FontWeight.w700,
|
||
height: 1.2,
|
||
);
|
||
|
||
/// 次要标签
|
||
static const TextStyle label = TextStyle(
|
||
color: PvHudColors.textSecondary,
|
||
fontSize: 12,
|
||
height: 1.2,
|
||
);
|
||
|
||
/// 更小的辅助文字(单位 / 角标)
|
||
static const TextStyle caption = TextStyle(
|
||
color: PvHudColors.textTertiary,
|
||
fontSize: 10,
|
||
height: 1.2,
|
||
);
|
||
}
|