feat(activity): 为子设备 SlaveActivity 添加调料秤重量增加高亮提醒功能

检测本机秤稳定后重量增加超过10g,高亮对应格子(红底白字),15秒后自动恢复
This commit is contained in:
2026-04-20 09:08:44 +08:00
parent 87bf11454c
commit 193acff1e0
3 changed files with 112 additions and 1 deletions
@@ -2,6 +2,8 @@ package com.shuwei.dish.match.ui
import android.annotation.SuppressLint
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
@@ -45,6 +47,13 @@ class SlaveActivity : BaseActivity() {
/** 已连接的主设备数量(有连接即代表主设备在线) */
private var masterConnected = false
/** 各秤地址的上一次重量快照,用于计算 delta */
private val weightSnapshot = mutableMapOf<Int, Double>()
/** 主线程 Handler,用于延迟清除高亮 */
private val mainHandler = Handler(Looper.getMainLooper())
/** 当前高亮清除任务,新高亮触发时取消旧任务 */
private var clearHighlightRunnable: Runnable? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySlaveBinding.inflate(layoutInflater)
@@ -134,9 +143,19 @@ class SlaveActivity : BaseActivity() {
/**
* 监听本机 WeightUtil 回调,实时刷新秤列表
* 22/18个秤走网格 adapter,其余走线性列表
* 秤稳定且重量增加超过阈值时,高亮对应格子,15秒后自动恢复
*/
private fun listenLocalScales() {
WeightUtil.addWeightListener(TAG) { address, state, weight ->
// 重量快照与高亮判断(在回调线程计算,不涉及 UI)
val baseline = weightSnapshot[address]
val shouldHighlight = baseline != null
&& state == WeightUtil.STATE_STABLE
&& (weight - baseline) > WEIGHT_DELTA_THRESHOLD
if (baseline == null || state == WeightUtil.STATE_STABLE) {
weightSnapshot[address] = weight
}
runOnUiThread {
when {
scale22Adapter != null -> {
@@ -167,6 +186,19 @@ class SlaveActivity : BaseActivity() {
linearAdapter.submitList(list)
}
}
// 触发格子高亮
if (shouldHighlight) {
clearHighlightRunnable?.let { mainHandler.removeCallbacks(it) }
val pos22 = ScaleDeviceConfig.SCALE_ORDER_22.indexOf(address)
val pos18 = ScaleDeviceConfig.SCALE_ORDER_18.indexOf(address)
scale22Adapter?.highlightPosition(pos22)
scale18Adapter?.highlightPosition(pos18)
clearHighlightRunnable = Runnable {
scale22Adapter?.clearHighlight()
scale18Adapter?.clearHighlight()
}.also { mainHandler.postDelayed(it, HIGHLIGHT_DURATION_MS) }
}
}
}
}
@@ -186,11 +218,16 @@ class SlaveActivity : BaseActivity() {
override fun onDestroy() {
ScaleServiceManager.onMasterConnectionChanged = null
WeightUtil.removeWeightListener(TAG)
clearHighlightRunnable?.let { mainHandler.removeCallbacks(it) }
super.onDestroy()
}
companion object {
const val TAG = "SlaveActivity"
/** 重量增加阈值(克),超过此值才触发高亮 */
private const val WEIGHT_DELTA_THRESHOLD = 10.0
/** 高亮自动恢复时间(毫秒) */
private const val HIGHLIGHT_DURATION_MS = 15_000L
}
/**