Jetpack Compose TextField视觉转换:每3位数字加空格的OffsetMapping反向转换公式实现
解决Jetpack Compose TextField OffsetMapping反向转换问题
很棒的思路已经搞定了正向转换!我来帮你推导反向的transformedToOriginal公式,其实它比你想象的简单~
推导思路
先回顾你的正向转换逻辑:每3个原始数字字符后添加一个空格,所以每处理3个原始字符,转换后的字符串会多出1个空格位置(相当于3个原始字符对应4个转换后字符)。
反向转换的核心就是计算转换后的偏移位置前包含了多少个空格,然后用转换后的偏移减去空格数量,就能得到原始偏移。
观察你给出的正向映射示例,我们可以总结出规律:
- 转换后的位置每经过4个字符(3数字+1空格),就会有1个空格
- 空格的数量等于转换后偏移量除以4的整数结果(Kotlin中整数除法自动向下取整)
反向转换公式
基于上面的分析,反向转换的公式非常直接:
offset - (offset / 4)
验证示例
我们用你给出的正向映射来反向验证:
| 转换后偏移(transformed) | 计算过程 | 原始偏移(original) | 是否匹配正向映射 |
|---|---|---|---|
| 0 | 0 - 0/4 = 0 | 0 | ✔️ |
| 1 | 1 - 1/4 = 1 | 1 | ✔️ |
| 2 | 2 - 2/4 = 2 | 2 | ✔️ |
| 4 | 4 - 4/4 = 3 | 3 | ✔️(正向3→4) |
| 5 | 5 - 5/4 = 4 | 4 | ✔️(正向4→5) |
| 8 | 8 - 8/4 = 6 | 6 | ✔️(正向6→8) |
| 12 | 12 - 12/4 = 9 | 9 | ✔️(正向9→12) |
| 13 | 13 - 13/4 = 10 | 10 | ✔️(正向10→13) |
完整代码
val phoneNumberOffsetTranslator = object : OffsetMapping { override fun originalToTransformed(offset: Int): Int { return (offset % 3) + (4 * (offset.div(3))) } override fun transformedToOriginal(offset: Int): Int { return offset - (offset / 4) } }
这个实现也能正确处理光标在空格位置的情况:比如转换后偏移3(空格位置),计算得到3-0=3,对应原始偏移3,光标会自动对应到空格后的数字位置,符合输入预期。
内容的提问来源于stack exchange,提问作者Hussien Fahmy
相关产品推荐
相关产品推荐

