Skip to content

WeKite 3.80:面板收起兜底 v6(@选人不再被误判成点聊天区)

Choose a tag to compare

@SymonChu SymonChu released this 15 Oct 06:03
· 2 commits to master since this release

WeKite 3.80

只改一件事:修「@某个人之后,输入框弹起来又马上收回」 —— 面板收起兜底第 6 版。

3.79 那版为什么会误收

你 10-15 那份日志(8.0.79)把真凶钉死了 —— 真正执行收起的 10 次全部来自同一个钩子:

panel collapse fired: action=0 ty=-1202.0 ime=false src=com.tencent.mm.ui.base.MMPullDownView.dispatchTouchEvent
钩子 执行收起的次数
外层容器 MMPullDownView.dispatchTouchEvent 10 / 10
挂在内层列表上的原生监听器钩(native-listener:w8) 0
内层 ScrollControlRecyclerView.onTouchEvent 0

原因:ViewGroup.dispatchTouchEvent 对落在它范围内的所有触摸都会触发 —— 哪怕这一下随后被后代消费掉。微信自己的收面板监听器挂在内层列表上,所以点 @成员列表 / 点表情面板不会触发它;而 v3.78 为了修 8.0.79 额外挂的外层钩子会。⇒「钩子被叫到」不等于「点在聊天区」。

其中 2 次正好发生在面板展开态(ty=-1202.0 ime=false),就是 @ 那一下。

这次(v6)怎么改

加一条坐标判据:「点聊天区」必须满足 触摸点在 footer 上沿之上。

依据是微信自己的布局:面板被 bottomMargin = -面板高 挤到 footer 底边之外,再用 translationY 整体上移把它露出来 ⇒ 展开时屏幕上从 footer 上沿往下依次是【输入行】【面板(表情面板 / @成员列表 / 「+」面板)】,也就是面板位于 footer 自己的边界下方。所以落在 footer 带内的一律原样交给微信处理(@选人、点表情、点输入框都靠它自己)。

对既有行为的影响:只有真正点在消息区(footer 上沿之上)才会收面板 —— 与「点聊天区收起」的定义一致;8.0.79 / 8.0.77 的收起路径一字未动。

请你这样测

  1. 覆盖安装(versionCode 1180 > 已装版本,直接覆盖)→ 重启微信。
  2. 群聊里 @某个人 → 选人 → 输入框应保持不收回,可以直接接着打字。
  3. 顺带回归:面板/键盘展开时点聊天区(消息之间、列表下方空白)→ 仍应收起。
  4. 日志(这次无论对错都能定案):
    • panel collapse skipped (touch on footer band): action=… rawY=… footerTop=… ⇒ @ 那一下被正确放过;
    • panel collapse touch [源]: … rawY=… footerTop=… ⇒ 记账行现在带坐标,可逐条核对;
    • 若出现 panel collapse fired: … rawY=… footerTop=… 且 rawY < footerTop ⇒ 判据没挡住,我换方向查(不再调阈值)。

装机注意

  • 没动任何 DEX 锚点,不会弹「DEX 缓存更新」。
  • 坐标判据成立的前提是「@成员列表确实落在 footer 那条带里」(按微信的布局推导应当成立),这次日志里的 rawY/footerTop 就是它的真机证据。

构建:run 254(id 38688939843)/ commit 5719d5de / 门禁 v3.80 新增 3 条标记(先在 v3.79 的包上实测全 MISS,反向恰好 3 条 FAIL)。