style: simplify button manager layout

This commit is contained in:
7015725
2026-05-13 08:15:45 +08:00
parent 3b6830e0ec
commit 648b45585a
4 changed files with 63 additions and 112 deletions

View File

@@ -515,7 +515,7 @@ FloatBallAppWM.prototype.createButtonManagerSummaryCard = function(parent, total
try { card.setElevation(this.dp(2)); } catch(eElev) { safeLog(null, 'e', "catch " + String(eElev)); }
var title = new android.widget.TextView(context);
title.setText("按钮管理首页");
title.setText("按钮统计");
title.setTextColor(isDark ? C.textPriDark : C.textPriLight);
title.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 15);
title.setTypeface(null, android.graphics.Typeface.BOLD);
@@ -776,7 +776,7 @@ FloatBallAppWM.prototype.buildButtonEditorPanelView = function() {
// 提示文字 (左侧)
var hintTv = new android.widget.TextView(context);
hintTv.setText("长按卡片排序");
hintTv.setText("点卡片编辑");
hintTv.setTextColor(subTextColor);
hintTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 12);
header.addView(hintTv);
@@ -808,7 +808,25 @@ FloatBallAppWM.prototype.buildButtonEditorPanelView = function() {
else enabledCount++;
}
} catch(eCnt) { safeLog(null, 'e', "catch " + String(eCnt)); }
self.createButtonManagerPolishedCard(panel, "按钮管理首页", "点卡片编辑;下方操作区负责排序、启用和删除", "共 " + buttons.length + " 个 · 已启用 " + enabledCount + " · 已禁用 " + disabledCount);
var statsStrip = new android.widget.LinearLayout(context);
statsStrip.setOrientation(android.widget.LinearLayout.VERTICAL);
statsStrip.setPadding(self.dp(12), self.dp(8), self.dp(12), self.dp(8));
statsStrip.setBackground(self.ui.createRoundDrawable(isDark ? self.withAlpha(C.cardDark, 0.42) : self.withAlpha(C.cardLight, 0.48), self.dp(14)));
var statsTv = new android.widget.TextView(context);
statsTv.setText("共 " + buttons.length + " 个 · 已启用 " + enabledCount + " · 已禁用 " + disabledCount);
statsTv.setTextColor(textColor);
statsTv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 13);
statsTv.setTypeface(null, android.graphics.Typeface.BOLD);
statsStrip.addView(statsTv);
var statsHint = new android.widget.TextView(context);
statsHint.setText("点卡片进入编辑;用上移/下移调整顺序");
statsHint.setTextColor(subTextColor);
statsHint.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 11);
statsHint.setPadding(0, self.dp(3), 0, 0);
statsStrip.addView(statsHint);
var statsLp = new android.widget.LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.MATCH_PARENT, android.widget.LinearLayout.LayoutParams.WRAP_CONTENT);
statsLp.setMargins(self.dp(2), 0, self.dp(2), self.dp(8));
panel.addView(statsStrip, statsLp);
// 按钮管理搜索卡片:搜索输入与操作按钮收在同一张卡片里,避免顶部显得零散。
var searchSurface = new android.widget.LinearLayout(context);
@@ -948,130 +966,60 @@ FloatBallAppWM.prototype.buildButtonEditorPanelView = function() {
mainRow.addView(textContainer);
// 右侧操作区
// 操作区:文字 chip 横排,替代孤立箭头,降低别扭感。
var actions = new android.widget.LinearLayout(context);
actions.setOrientation(android.widget.LinearLayout.HORIZONTAL);
actions.setGravity(android.view.Gravity.CENTER_VERTICAL);
actions.setPadding(self.dp(42), 0, 0, 0); // 上移/下移(排序按钮布局优化:扩大点击面积,顶部/底部也占位,避免难点)
// 说明:原先 ▲▼ 太小且只有可用时才出现,手指很难点中;这里改为固定 2 个大按钮44dp不可用则置灰禁用。
var sortBox = new android.widget.LinearLayout(context);
sortBox.setOrientation(android.widget.LinearLayout.HORIZONTAL); // # 排序按钮改为横向排列,减少占高
sortBox.setGravity(android.view.Gravity.CENTER);
actions.setGravity(android.view.Gravity.RIGHT | android.view.Gravity.CENTER_VERTICAL);
actions.setPadding(self.dp(42), 0, 0, 0);
// 按钮公共样式
var mkSortBtn = function(txt, enabled, onClickFn) {
var tv = new android.widget.TextView(context);
tv.setText(txt);
tv.setGravity(android.view.Gravity.CENTER);
tv.setTextSize(12); // # 排序按钮适量缩小字号
tv.setMinWidth(self.dp(36)); // # 排序按钮适量缩小点击块
tv.setMinHeight(self.dp(36)); // # 排序按钮适量缩小点击块
tv.setPadding(0, 0, 0, 0);
// 轻量边框+圆角,提升"可点击"视觉
try {
var bg = new android.graphics.drawable.GradientDrawable();
bg.setColor(android.graphics.Color.TRANSPARENT);
bg.setCornerRadius(self.dp(8)); // # 小一点圆角更紧凑
bg.setStroke(self.dp(1), self.withAlpha(subTextColor, 0.22));
tv.setBackground(bg);
} catch(eBg) { safeLog(null, 'e', "catch " + String(eBg)); }
if (!enabled) {
tv.setEnabled(false);
tv.setTextColor(self.withAlpha(subTextColor, 0.25));
} else {
tv.setEnabled(true);
tv.setTextColor(subTextColor);
tv.setOnClickListener(new android.view.View.OnClickListener({
onClick: function() {
try { onClickFn(); } catch(eSort) { safeLog(null, 'e', "catch " + String(eSort)); }
}
}));
}
return tv;
};
// 上移按钮(顶部也占位)
var canUp = (idx > 0);
var u = mkSortBtn("", canUp, function() {
var btnUp = self.createButtonManagerActionChip("上移", canUp ? subTextColor : self.withAlpha(subTextColor, 0.25), self.withAlpha(subTextColor, canUp ? 0.24 : 0.12), canUp ? function() {
var temp = buttons[idx];
buttons[idx] = buttons[idx - 1];
buttons[idx - 1] = temp;
refreshPanel();
});
sortBox.addView(u);
} : null);
try { btnUp.setEnabled(canUp); } catch(eUpEn) {}
actions.addView(btnUp);
// 下移按钮(底部也占位)
var canDown = (idx < buttons.length - 1);
var d = mkSortBtn("", canDown, function() {
var btnDown = self.createButtonManagerActionChip("下移", canDown ? subTextColor : self.withAlpha(subTextColor, 0.25), self.withAlpha(subTextColor, canDown ? 0.24 : 0.12), canDown ? function() {
var temp = buttons[idx];
buttons[idx] = buttons[idx + 1];
buttons[idx + 1] = temp;
refreshPanel();
} : null);
try {
var lpDown = new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
lpDown.leftMargin = self.dp(6);
btnDown.setLayoutParams(lpDown);
btnDown.setEnabled(canDown);
} catch(eDownLp) {}
actions.addView(btnDown);
var btnToggle = self.createButtonManagerActionChip(__enabled ? "禁用" : "启用", __enabled ? self.withAlpha(subTextColor, 0.9) : self.withAlpha(C.success, 0.9), self.withAlpha(__enabled ? subTextColor : C.success, 0.24), function() {
try {
btnCfg.enabled = (btnCfg.enabled === false) ? true : false;
ConfigManager.saveButtons(buttons);
} catch(eTg) { safeLog(null, 'e', "catch " + String(eTg)); }
refreshPanel();
});
// 两按钮之间留一点间距,避免误触
try {
var lpD = new android.widget.LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT
);
lpD.leftMargin = self.dp(6); // # 横向排列:用左间距代替上间距
d.setLayoutParams(lpD);
} catch(eLp) { safeLog(null, 'e', "catch " + String(eLp)); }
sortBox.addView(d);
actions.addView(sortBox);
// # 禁用/启用:管理页直接切换显示状态(禁用后按钮页不显示该按钮)
var btnToggle = new android.widget.TextView(context);
btnToggle.setText(__enabled ? "禁用" : "启用");
btnToggle.setGravity(android.view.Gravity.CENTER);
btnToggle.setTextSize(12);
btnToggle.setMinWidth(self.dp(44));
btnToggle.setMinHeight(self.dp(36));
btnToggle.setPadding(self.dp(6), 0, self.dp(6), 0);
try {
var tgBg = new android.graphics.drawable.GradientDrawable();
tgBg.setColor(android.graphics.Color.TRANSPARENT);
tgBg.setCornerRadius(self.dp(8));
tgBg.setStroke(self.dp(1), self.withAlpha(subTextColor, 0.22));
btnToggle.setBackground(tgBg);
} catch(eTgBg) { safeLog(null, 'e', "catch " + String(eTgBg)); }
btnToggle.setTextColor(__enabled ? self.withAlpha(subTextColor, 0.9) : self.withAlpha(C.success, 0.9));
try {
var lpTg = new android.widget.LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT
);
var lpTg = new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
lpTg.leftMargin = self.dp(6);
btnToggle.setLayoutParams(lpTg);
} catch(eLpTg) { safeLog(null, 'e', "catch " + String(eLpTg)); }
btnToggle.setOnClickListener(new android.view.View.OnClickListener({
onClick: function() {
try {
btnCfg.enabled = (btnCfg.enabled === false) ? true : false;
// # 立即持久化,避免面板关闭后丢失
ConfigManager.saveButtons(buttons);
} catch(eTg) { safeLog(null, 'e', "catch " + String(eTg)); }
refreshPanel();
}
}));
} catch(eLpTg) {}
actions.addView(btnToggle);
// 删除按钮
var btnDel = new android.widget.TextView(context);
btnDel.setText("✕"); // 垃圾桶图标更好但这里用X
btnDel.setTextColor(self.withAlpha(C.danger, 0.7));
btnDel.setTextSize(16);
btnDel.setPadding(self.dp(10), self.dp(10), self.dp(4), self.dp(10));
btnDel.setOnClickListener(new android.view.View.OnClickListener({
onClick: function() {
// 确认删除
buttons.splice(idx, 1);
refreshPanel();
}
}));
var btnDel = self.createButtonManagerActionChip("删除", self.withAlpha(C.danger, 0.85), self.withAlpha(C.danger, 0.28), function() {
buttons.splice(idx, 1);
refreshPanel();
});
try {
var lpDel = new android.widget.LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
lpDel.leftMargin = self.dp(6);
btnDel.setLayoutParams(lpDel);
} catch(eLpDel) {}
actions.addView(btnDel);
card.addView(mainRow);