micarx 滑块组件知识库(IconSeekBar / Slider 族)
代码基线:
/home/zbc/car/Micarx/MiCarSupport@ dev 分支 tip52a51649(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-速查卡与排障索引 | 字段/行号速查、已知坑、排障决策树 | 救火时从这篇进 |
学习路线
- 只想用组件:05(选型)→ 04(API)→ 02 §回调时机
- 要改手势/排查触控 bug:01(地图)→ 02(全流程)→ 03(主题拦截)→ 06(已知坑)
- 排查”点击跳值/取整”类问题:03(GT 抑制机制)→ 能量回收 KB 02(取整在 Settings 层)→ 06
全局结论(先看这五条)
- IconSlider 继承 material Slider 继承 BaseSlider(不是包装);IconSeekBar 继承
micarx
AppCompatSeekBar(MAT/micarx/appcompat/widget/,不是 androidx 的)继承 androidx AppCompatSeekBar。两族零共享代码,delegate 体系也互相独立。 - 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))。 - 取整不在组件库:全仓 grep 无
alignAdjustProgress/mProgressChangeTimes;组件库唯一 的吸附是stepSize > 0时snapPosition的档位取整(BaseSlider:2335-2342), 连续模式(stepSize=0)无任何取整。整十吸附是 Settings 层机制。 - IconSlider/IconSeekBar 的按压动画有两组:Normal 组(thumb 缩放+轨道 ×1.05)与
GT/Ultra 组(背景左右扩张+轨道增高+文字放大),由 delegate
shouldStartPressAnim()分流;IconSlider 还会同时抑制掉 BaseSlider/mt Slider 自带的动画(startCustomAnim恒 true 拦截,IconSlider.java:340-347)。 - 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,只恢复不落盘