style: soften balloon settings page

This commit is contained in:
7015725
2026-05-14 23:24:48 +08:00
parent 8907a2d5d8
commit 7079b633bb
5 changed files with 37 additions and 57 deletions

View File

@@ -778,17 +778,17 @@ var ConfigManager = {
{ key: "PANEL_BG_ALPHA", name: "面板背景透明度(0.1~1.0)", type: "float", min: 0.1, max: 1.0, step: 0.05 },
{ type: "section", name: "悬浮球" },
{ key: "BALL_SIZE_DP", name: "悬浮球大小(dp)", type: "int", min: 28, max: 120, step: 1 },
{ key: "BALL_PANEL_GAP_DP", name: "球与面板间距(dp)", type: "int", min: 0, max: 60, step: 1 },
{ key: "BALL_ICON_TYPE", name: "图标类型", type: "single_choice", options: [
{ label: "应用图标 (app)", value: "app" },
{ label: "文件图标 (file)", value: "file" },
{ label: "ShortX内置 (shortx)", value: "shortx" }
{ key: "BALL_SIZE_DP", name: "球大小", type: "int", min: 28, max: 120, step: 1 },
{ key: "BALL_PANEL_GAP_DP", name: "离小屋的距离", type: "int", min: 0, max: 60, step: 1 },
{ key: "BALL_ICON_TYPE", name: "气球徽章", type: "single_choice", options: [
{ label: "应用头像", value: "app" },
{ label: "文件选择", value: "file" },
{ label: "岛上图标库", value: "shortx" }
]},
{ key: "BALL_ICON_FILE_PATH", name: "图标路径(file模式)", type: "text" },
{ key: "BALL_ICON_RES_NAME", name: "ShortX图标", type: "ball_shortx_icon" },
{ key: "BALL_ICON_TINT_HEX", name: "图标颜色", type: "ball_color" },
{ key: "BALL_IDLE_ALPHA", name: "闲置不透明度(0.1~1.0)", type: "float", min: 0.1, max: 1.0, step: 0.05 },
{ key: "BALL_ICON_FILE_PATH", name: "已选择的图标文件", type: "text" },
{ key: "BALL_ICON_RES_NAME", name: "岛上图标", type: "ball_shortx_icon" },
{ key: "BALL_ICON_TINT_HEX", name: "气球颜色", type: "ball_color" },
{ key: "BALL_IDLE_ALPHA", name: "安静时透明度", type: "float", min: 0.1, max: 1.0, step: 0.05 },
{ type: "section", name: "面板布局" },
{ key: "PANEL_ROWS", name: "面板可视行数(超出滚动)", type: "int", min: 1, max: 12, step: 1 },

View File

@@ -407,7 +407,7 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi
}
refreshBallShortXPreview();
var btnPick = self.ui.createFlatButton(self, "选择图标", primary, function() {
var btnPick = self.ui.createFlatButton(self, "换一个", primary, function() {
self.touchActivity();
self.showShortXIconPickerPopup({
currentName: String(self.getPendingValue(item.key) || ""),
@@ -430,7 +430,7 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi
gapView.setLayoutParams(new android.widget.LinearLayout.LayoutParams(self.dp(8), 1));
iconRow.addView(gapView);
var btnClear = self.ui.createFlatButton(self, "清空", secColor, function() {
var btnClear = self.ui.createFlatButton(self, "不用图标", secColor, function() {
self.touchActivity();
try {
self.setPendingValue(item.key, "");
@@ -484,7 +484,7 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi
}
refreshBallColorPreview();
var btnColor = self.ui.createFlatButton(self, "选择颜色", primary, function() {
var btnColor = self.ui.createFlatButton(self, "颜色", primary, function() {
self.touchActivity();
self.showColorPickerPopup({
currentColor: String(self.getPendingValue(item.key) || ""),
@@ -505,7 +505,7 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi
gapColorView.setLayoutParams(new android.widget.LinearLayout.LayoutParams(self.dp(8), 1));
colorRow.addView(gapColorView);
var btnClearColor = self.ui.createFlatButton(self, "清空", secColor, function() {
var btnClearColor = self.ui.createFlatButton(self, "恢复默认", secColor, function() {
self.touchActivity();
try {
self.setPendingValue(item.key, "");

View File

@@ -254,35 +254,15 @@ FloatBallAppWM.prototype.buildSettingsGroupPanelView = function() {
var isDark = this.isDarkTheme();
var C = this.ui.colors;
var bgColor = isDark ? C.bgDark : C.bgLight;
var cardColor = isDark ? C.cardDark : C.cardLight;
var textColor = isDark ? C.textPriDark : C.textPriLight;
var T = this.getAnimalIslandTheme();
var bgColor = T.bg;
var cardColor = T.card;
var textColor = T.text;
var panel = this.ui.createStyledPanel(this, 16);
try { panel.setBackground(this.ui.createRoundDrawable(T.bg, this.dp(18))); } catch(ePanelBg) {}
var header = this.ui.createStyledHeader(this, 8);
// 内存显示
var memTv = new android.widget.TextView(context);
memTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 10);
memTv.setTextColor(isDark ? C.textSecDark : C.textSecLight);
memTv.setPadding(0, 0, this.dp(8), 0);
function updateMem() {
try {
var rt = java.lang.Runtime.getRuntime();
var total = rt.totalMemory() / 1024 / 1024;
var free = rt.freeMemory() / 1024 / 1024;
var used = total - free;
var max = rt.maxMemory() / 1024 / 1024;
memTv.setText("Mem: " + used.toFixed(0) + "/" + max.toFixed(0) + "M");
} catch(e) { memTv.setText("Mem: ?"); }
}
updateMem();
memTv.setOnClickListener(new android.view.View.OnClickListener({
onClick: function() { updateMem(); self.toast("内存已刷新"); }
}));
header.addView(memTv);
// 占位 View 顶替标题位置,让右侧按钮靠右
header.addView(this.ui.createSpacer(this));
@@ -295,11 +275,11 @@ FloatBallAppWM.prototype.buildSettingsGroupPanelView = function() {
previewBox.setOrientation(android.widget.LinearLayout.HORIZONTAL);
previewBox.setGravity(android.view.Gravity.CENTER_VERTICAL);
previewBox.setPadding(this.dp(8), this.dp(2), this.dp(4), this.dp(2));
previewBox.setBackground(self.ui.createRoundDrawable(self.withAlpha(C.accent, 0.1), self.dp(16))); // 浅色背景提示
previewBox.setBackground(self.ui.createRoundDrawable(self.withAlpha(T.primarySoft, isDark ? 0.70 : 0.95), self.dp(16))); // 浅色背景提示
var tvPreview = new android.widget.TextView(context);
tvPreview.setText("实时预览");
tvPreview.setTextColor(C.accent);
tvPreview.setText("边调边看");
tvPreview.setTextColor(T.primaryDeep);
tvPreview.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 12);
tvPreview.setTypeface(null, android.graphics.Typeface.BOLD);
tvPreview.setPadding(0, 0, this.dp(4), 0);
@@ -309,8 +289,8 @@ FloatBallAppWM.prototype.buildSettingsGroupPanelView = function() {
try { switchPreview.setTextOn(""); switchPreview.setTextOff(""); } catch(eT) { safeLog(null, 'e', "catch " + String(eT)); }
try {
var states = [[android.R.attr.state_checked], [-android.R.attr.state_checked]];
var thumbColors = [C.accent, isDark ? (0xFF555555 | 0) : (0xFFCCCCCC | 0)];
var trackColors = [self.withAlpha(C.accent, 0.5), self.withAlpha(isDark ? (0xFF555555 | 0) : (0xFFCCCCCC | 0), 0.5)];
var thumbColors = [T.primary, isDark ? T.card2 : (0xFFCCCCCC | 0)];
var trackColors = [self.withAlpha(T.primary, 0.5), self.withAlpha(isDark ? T.card2 : (0xFFCCCCCC | 0), 0.5)];
switchPreview.setThumbTintList(new android.content.res.ColorStateList(states, thumbColors));
switchPreview.setTrackTintList(new android.content.res.ColorStateList(states, trackColors));
} catch(e) { safeLog(null, 'e', "catch " + String(e)); }
@@ -321,9 +301,9 @@ FloatBallAppWM.prototype.buildSettingsGroupPanelView = function() {
self.touchActivity();
self.state.previewMode = !!checked;
if (checked) {
self.toast("预览模式已开启:修改配置实时生效");
tvPreview.setTextColor(C.accent);
previewBox.setBackground(self.ui.createRoundDrawable(self.withAlpha(C.accent, 0.1), self.dp(16)));
self.toast("边调边看已开启");
tvPreview.setTextColor(T.primaryDeep);
previewBox.setBackground(self.ui.createRoundDrawable(self.withAlpha(T.primarySoft, isDark ? 0.70 : 0.95), self.dp(16)));
self.refreshPreview();
} else {
self.toast("预览模式已关闭");
@@ -339,7 +319,7 @@ FloatBallAppWM.prototype.buildSettingsGroupPanelView = function() {
header.addView(previewBox);
// [恢复] 保存按钮(放在最后一位)
var btnOk = this.ui.createSolidButton(this, "保存", C.primary, android.graphics.Color.WHITE, function() {
var btnOk = this.ui.createSolidButton(this, "保存装扮", T.primary, T.onPrimary, function() {
try {
self.touchActivity();
if (self.L) self.L.i("settings confirm click");
@@ -387,7 +367,7 @@ FloatBallAppWM.prototype.buildSettingsGroupPanelView = function() {
function createCard() {
var c = new android.widget.LinearLayout(context);
c.setOrientation(android.widget.LinearLayout.VERTICAL);
c.setBackground(self.ui.createRoundDrawable(cardColor, self.dp(12)));
c.setBackground(self.ui.createStrokeDrawable(cardColor, self.withAlpha(T.stroke, isDark ? 0.28 : 0.46), self.dp(1), self.dp(16)));
try { c.setElevation(self.dp(2)); } catch(e) { safeLog(null, 'e', "catch " + String(e)); }
try { c.setClipToOutline(true); } catch(e) { safeLog(null, 'e', "catch " + String(e)); }
var lp = new android.widget.LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.MATCH_PARENT, android.widget.LinearLayout.LayoutParams.WRAP_CONTENT);

View File

@@ -2,8 +2,8 @@
"alg": "SHA256withRSA",
"files": {
"th_01_base.js": {
"sha256": "30c121902ef5a0006a5daabca8443ed6cbf6e2508209604c48f89855d0690034",
"size": 52546
"sha256": "69131e872988a13b642c0cefa3243bab93f2fa8fdfbf3e4e80edb93dbb472d2e",
"size": 52510
},
"th_02_core.js": {
"sha256": "15bb9bfbd19a673d442e221b0a00a456ed5f87af2666b9c73b117d6223faeecd",
@@ -50,12 +50,12 @@
"size": 2362
},
"th_13_panel_ui.js": {
"sha256": "19e5e1c346051aafdda6253ed7c25ef5fbc4f883de66f656c9575d97e9d6ffc8",
"size": 20386
"sha256": "e29f3375c02a834dd678b095e179589008b5f40a37ed12b88263d8a8913014c3",
"size": 20392
},
"th_14_panels.js": {
"sha256": "1ea35e0167661b5bba0652e672acad45e8cecb09d174763ae6bbcf3f8a8a582e",
"size": 244019
"sha256": "00e0ed6a9dc71c1d02ee027e973d80525ed7c1048d56773ad778caec83f116d5",
"size": 243292
},
"th_15_extra.js": {
"sha256": "1e5a52de2475980da593d7d6f8bf0bdda6966ba3b9688bb5eb8b4343c8734f3f",
@@ -68,5 +68,5 @@
},
"keyId": "toolhub-targets-2026-rsa3072",
"schema": 2,
"version": 20260514151539
"version": 20260514152440
}

View File

@@ -1 +1 @@
YHDfLmzWffqmb4iPzy6Fh7pS0q6Ye2nDTqg+aHukOCghBrzwYHf5CCGHADxmzJYx78aPh1EZzJ1ykxVuN7peD4ipLrzYq7D88/IkVCxtt2pEJEfQuuPX2rUGKpmIeVvoxGMN5aHWdNFmR4W/bfc0f2lVDPWQNkdZz2VkmK49Krv1LZXaWaIAvHqma2NGdIAC/ZTuycQYmT7KRTsh7SdMEKbg8lGHM53ABwtzKgMK73bXXaU3rzv/36wpVilPWND/Xkdo/dmuh3yQkt0NY7WuLSu1ETrnKy75rQHbculPU6gzHFEO7kY5OGiNfceyc1en7F+f5WciyRxGuGSX4kcC6dkc3I/TBmsH47FhEmo2ieF5Lyck5b32Mucjwjv5uIOY7tny3Yw0sc9MFd4r5fIM7nnNTZvroWmuZ9HuIxv/um1ZGVtOS2Wp/D5YT3Ej25B6aGOJaLmSs3/6ECqfhFIwXzBCyUQE7V6fasTrM5yTUx51YrWo80fD+Nf7z4Dlxgvm
CeNBRvavzmZG5WvOg4s0p5V4kYTlHzy5iIYhHvCXS0rnQ6if1R0BsO8+RSXpkUzTK5dXmDddjPkHHWqkt7YQmKWWoMSWubu6cD3m3L+1apFx9jBrMp9Lj4Dj8z5bOv0HMChTtd2OnFXILA8Aq9k/eZsXpOE262ZQgU6ArdSY+TozT/+QJpC1QTKkmJe1IiIT+hDhH4Yo/E55MchPrBXF3VbqCG6dh6iBkwYAzxLoqhELMNa0hu1ilPNv7DcmfJu8hVHXwRuOfjgGl60Tdmf3saQNOEQlR3NBpAbiBUZA0D9ZepVUjgLsbkoKGCMESa44dkKuz03ot1i5f+Q5mdm9pZtG8hsgodE8p3h2ttAuhiKy/791sHCdE3ngkN2X5sR/gGqTCfdcw2wWce0LQ5WUrkG6YFJxWZYbzq+OWrWT802SPjD8oXPWPQQTbDbSzzWquc8Vo896hK1+ZQ1T6dEwnsj+Xbrx/CFapvHVxH86EsO8KvSmCdtDL4Qyx7x8MlJS