06 · 速查卡与排障索引

救火从这篇进。行号基于 MiCarSupport @ dev 52a51649(micarx 3.2.8),老版本分支 (3.2.5/RC11 等)行号有漂移,按符号名 grep。

1. 三十秒决策树

flowchart TD
    Q["现象?"] --> A["点轨道跳了值/被取整"]
    Q --> B["点轨道没反应(GT)"]
    Q --> C["拖动不跟手/脱钩"]
    Q --> D["thumb 视觉错位"]
    Q --> E["按压动画异常"]
    Q --> F["值没保存/回调口径不对"]

    A --> A1["取整不在组件库!<br/>去 Settings 层查 mProgressChangeTimes<br/>能量回收 KB 02 篇"]
    A --> A2["组件库侧只有 stepSize 吸附<br/>BaseSlider:2335-2342"]
    B --> B1["by design: GT/Ultra 点击抑制<br/>03 篇 §3(ignoreClick 重锚定)"]
    C --> C1["ignoreClick 的 mOffset 只在 DOWN 算<br/>手势中途程序 setValue 会瞬移<br/>03 篇 §3.5-1"]
    C --> C2["滚动容器内 DOWN 被延迟<br/>看 setScrollDragEnable :3199"]
    D --> D1["触摸坐标系带 padding 补偿<br/>绘制坐标系不带 + trackRadius 清零 sidePadding<br/>03 篇 §4"]
    D --> D2["GT 轨道中心=(h+hintH)/2 非 view 中心<br/>04 篇 §2 几何钩子"]
    E --> E1["IconSlider/IconSeekBar 抑制了基类动画<br/>查自研双组动画 04 篇"]
    E --> E2["量程非 0~100 时 GT 边缘特判失效<br/>04 篇 §2 applyPressOffsets"]
    F --> F1["组件库 SliderPreference 只恢复不落盘<br/>05 篇 §2"]
    F --> F2["SeekBarPreferenceCompat 回调不含 min 偏移<br/>05 篇 §3"]

2. 关键符号 → 行号速查

BaseSlider(MAT/BaseSlider.java)

符号行用途
onTouchEvent2172手势唯一入口(无 dispatchTouchEvent)
ignoreClick268 / 595 / 666-672 / 2177GT 点击抑制标志
transformTouchEvent / computeTouchOffset2304 / 2314事件重锚定
generateTouchPosition2287x→归一化 touchPosition
snapPosition2335组件库唯一吸附(stepSize 档位)
snapThumbToValue2413改值唯一路径,THRESHOLD=1e-4(:244)
dispatchOnChangedFromUser / Programmatically2651 / 2642fromUser=true/false
onStartTrackingTouch / onStopTrackingTouch2661 / 2668touch 回调
pickActiveThumb2349选 thumb(非 hit test)
scaledTouchSlop470系统 slop /2
trackOffsetY256GT 按压轨道增厚(px)
setTrackRadius 清零 sidePadding647-660(清零 :659)坐标系错位线索
thumb 绘制中心(无 padding 补偿)2130坐标系错位线索
setScrollDragEnable3199滚动容器内强制可拖
setPressEnlarge3203GT/Ultra 被 delegate 拦截(:3205)
mSeekBarLocation326死字段
mThumbWdithScale 拼写IconSlider:104 / IconSeekBar:107Width→Wdith,grep 注意

Slider(MAT/Slider.java)

符号行用途
pickActiveThumb override139-147单 thumb 恒选 0
startCustomAnim/reverseCustomAnim149-165GT/Ultra 走 SliderAnimation
SliderAnimation173-228trackOffsetY 0→2dp + thumb 高×2,225ms
shouldDrawCompatHalo168-171恒 false,不画 halo

IconSlider / IconSeekBar(ABW)

符号行用途
IconSlider.onTouchEvent566-598强制 setIgnoreClick(:570-572)+ 按压动画分流
IconSlider.startCustomAnim 恒 true340-347抑制基类动画
IconSlider onLayout setThumbPadding(w/2)289触摸映射内缩半 thumb
IconSeekBar.onTouchEvent592-623shouldTransformTouchEvent(:596)+ 按压动画
IconSeekBar startPressAnim 双触发608 + AppCompatSeekBar:225DOWN 执行两遍,幂等但冗余
IconSeekBar checkValue(max≠min)212-216IAE 硬约束
applyPressOffsets 写死 0/100IconSlider:39-41, GT delegate:158-167非 0~100 量程边缘特判失效

delegate 点击抑制返回值

delegateNormalGTUltra
IconSliderThemeDelegate.shouldIgnoreClickfalse(:109)true(:152)true(:153)
SeekBarThemeDelegate.shouldTransformTouchEventfalse(:123)true(:157)true(:157)

3. 已知坑清单

  1. IconSeekBar DOWN 双触发 startPressAnim(子类 :608 + 父类 :225),GT 动画重建两次。
  2. applyPressOffsets 边缘判定写死 0/100 量程,非 0~100 恒走中间档。
  3. 组件库 SliderPreference 只恢复不落盘(setValueInternal 无 persistInt)。
  4. SeekBarPreferenceCompat 回调不含 min 偏移,显示口径含 min。
  5. mOffset 手势期间不刷新,程序 setValue 打断拖动会瞬移。
  6. mThumbWdithScale 拼写错误,两个文件同步存在。
  7. tap 会成对触发 start/stop tracking(UP 补发 :2248),下游勿把 start 当”开始拖动”。
  8. 程序 setValue 不做 step 吸附也不校验,非法值延迟到 onDraw 抛 ISE(:741-752)。
  9. IconSlider/IconSeekBar 与 BaseSlider 坐标系差异(03 篇 §4)是 GT 视觉错位的候选根因。
  10. 取整(整十吸附)不在组件库——别再 grep alignAdjustProgress,在 Settings 层 settingsBaseUi SliderPreference。

4. 版本与分支速查

  • dev 是唯一开发主线(01 篇);版本节奏:3.2.5(07-20)→3.2.6(08-14)→3.2.7(09-23)→ 3.2.8(2026-10-21,gradle.properties version-first-number=3.2 second=8)。
  • GT 竖条 thumb 资源:material/src/main/res/drawable/micar_appcompat_slider_thumb_bg_gt.xml (6dp×32dp);mThumbPaddingGT=8dp(dimens.xml:30)。
  • 热修线:hotfix-3.2.0 / hotfix-3.2.2 / rls-xcd-u-mp-26-v5.0-hotfix-10327(3.1.16)。

5. 互链

  • 能量回收知识库——取整机制(Settings 层)、 N801PROB-132401 三轮修复史、GT 错位调查(08 篇)。
  • N801PROB-144519:限速滑块平行实现漏网(05 篇 §5 教训)。