micarx 滑块组件知识库(IconSeekBar / Slider 族)

代码基线:/home/zbc/car/Micarx/MiCarSupport @ dev 分支 tip 52a51649(micarx 3.2.8, 2026-10-21)。模块缩写:MAT = material/src/main/java/com/mi/car/material/slider/, ABW = androidbasewidget/src/main/java/micarx/androidbasewidget/, PREF = preference/src/main/java/micarx/preference/。

与业务侧联动:能量回收知识库(取整机制在 Settings 层, 组件库只提供手势与主题能力,两库互链)。

一句话总览

micarx 有两套互不同源的滑块体系:BaseSlider/Slider/IconSlider(float 值域,fork 自 Google Material Slider) 与 AppCompatSeekBar/IconSeekBar(int progress,基于原生 SeekBar);另有独立自绘的 VerticalSlider。三套都被「Normal / GT / Ultra 主题 delegate 策略」横切,GT/Ultra 的”点击轨道不跳值”由 触摸事件 X 偏移重锚定(不是丢弃事件)实现。 取整(整十吸附)不在组件库,组件库只有 stepSize 档位吸附;整十取整是 Settings 层 SliderPreference 的计数器机制(见能量回收 KB 02 篇)。

分篇索引

篇内容适合场景
01-类体系与模块分工两套体系继承图、模块分工、选型矩阵第一次接触,先建立地图
02-触摸事件全流程DOWN→MOVE→UP 逐分支、hit test、值换算、回调时机改手势/查触控 bug 必读
03-主题系统与GT点击抑制三套 delegate、ignoreClick 重锚定机制、三主题差异表主题差异、GT 点击问题
04-IconSeekBar与IconSlider精读构造/绘制/按压动画/公开 API用这两个组件开发
05-preference封装层与Settings使用地图三个 Preference 封装、Settings 侧谁在用哪个组件接 preference、找使用方
06-速查卡与排障索引字段/行号速查、已知坑、排障决策树救火时从这篇进

学习路线

  1. 只想用组件:05(选型)→ 04(API)→ 02 §回调时机
  2. 要改手势/排查触控 bug:01(地图)→ 02(全流程)→ 03(主题拦截)→ 06(已知坑)
  3. 排查”点击跳值/取整”类问题:03(GT 抑制机制)→ 能量回收 KB 02(取整在 Settings 层)→ 06

全局结论(先看这五条)

  1. IconSlider 继承 material Slider 继承 BaseSlider(不是包装);IconSeekBar 继承 micarx AppCompatSeekBar(MAT/micarx/appcompat/widget/,不是 androidx 的)继承 androidx AppCompatSeekBar。两族零共享代码,delegate 体系也互相独立。
  2. GT/Ultra “点击不跳值” = 事件平移重锚定:DOWN 时算 mOffset = thumbX − 按下点X, 之后所有触摸事件 offsetLocation(mOffset, 0),下游看到的等效于”按在 thumb 上”。 Slider 族走 BaseSlider.ignoreClick(:268/:595/:2177),SeekBar 族走 SeekBarThemeDelegate.shouldTransformTouchEvent()。GT/Ultra delegate 恒 true, Normal 恒 false(IconSlider 在 onTouchEvent 里每个事件强制 setIgnoreClick(true))。
  3. 取整不在组件库:全仓 grep 无 alignAdjustProgress/mProgressChangeTimes;组件库唯一 的吸附是 stepSize > 0 时 snapPosition 的档位取整(BaseSlider:2335-2342), 连续模式(stepSize=0)无任何取整。整十吸附是 Settings 层机制。
  4. IconSlider/IconSeekBar 的按压动画有两组:Normal 组(thumb 缩放+轨道 ×1.05)与 GT/Ultra 组(背景左右扩张+轨道增高+文字放大),由 delegate shouldStartPressAnim() 分流;IconSlider 还会同时抑制掉 BaseSlider/mt Slider 自带的动画(startCustomAnim 恒 true 拦截,IconSlider.java:340-347)。
  5. Settings 侧不用组件库的 preference 封装:组件库 SliderPreference/SeekBarPreference(Compat) 在 MiCarSettings 零使用;Settings 用自建 settingsBaseUi SliderPreference(1109 行,绑 IFusionSlider)+ MiCarSlider/MiCarIconSlider/MiCarIconSeekBar 三个 widget 包装类。 组件库版 SliderPreference 还有”只恢复不落盘”的半移植缺口(见 05 篇 §2)。

已知坑速览(详见 06 篇)

  • IconSeekBar DOWN 时 startPressAnim 被执行两遍(子类一次+父类一次,GT 路径动画重建两次,幂等但冗余)
  • applyPressOffsets 的边缘判定写死 MAX_VALUE_GT=100/MIN_VALUE_GT=0,非 0~100 量程的 slider 边缘特判失效
  • mThumbWdithScale 拼写错误(Width→Wdith),IconSeekBar/IconSlider 同步存在,grep 时注意
  • 组件库版 SliderPreference setValueInternal 不调 persistInt,只恢复不落盘