@buaa_smat/hometrans 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +141 -124
  2. package/agents/build-fixer.md +1 -0
  3. package/agents/code-review-fix.md +1 -0
  4. package/agents/code-reviewer.md +1 -0
  5. package/agents/logic-coding.md +1 -0
  6. package/agents/logic-context-builder.md +1 -0
  7. package/agents/review-fixer.md +1 -0
  8. package/agents/self-test-fixer.md +1 -0
  9. package/agents/self-tester.md +260 -233
  10. package/agents/spec-generator.md +1 -0
  11. package/agents/test-tools/autotest/README.md +223 -0
  12. package/agents/test-tools/autotest/config.yaml.example +58 -0
  13. package/agents/test-tools/autotest/pyproject.toml +16 -0
  14. package/agents/test-tools/autotest/report_tool.py +759 -0
  15. package/agents/test-tools/autotest/self_test_runner.py +773 -0
  16. package/agents/test-tools/autotest/testcases_schema.md +143 -0
  17. package/agents/test-tools/autotest/testcases_tool.py +215 -0
  18. package/agents/test-tools/autotest/uv.lock +3156 -0
  19. package/agents/test-tools/harmony_autotest-0.1.0-py3-none-any.whl +0 -0
  20. package/agents/test-tools/hypium-6.1.0.210-py3-none-any.whl +0 -0
  21. package/agents/test-tools/hypium_mcp-0.6.5-py3-none-any.whl +0 -0
  22. package/agents/test-tools/xdevice-6.1.0.210-py3-none-any.whl +0 -0
  23. package/agents/test-tools/xdevice_devicetest-6.1.0.210-py3-none-any.whl +0 -0
  24. package/agents/test-tools/xdevice_ohos-6.1.0.210-py3-none-any.whl +0 -0
  25. package/dist/cli/config-store.js +27 -2
  26. package/dist/cli/config.js +17 -6
  27. package/dist/cli/index.js +3 -2
  28. package/dist/cli/init.js +135 -22
  29. package/dist/cli/mcp.js +2 -2
  30. package/dist/context/index.js +165 -69
  31. package/package.json +59 -60
  32. package/skills/code-dev-review-fix/SKILL.md +279 -0
  33. package/skills/code-dev-review-fix-workspace/evals/evals.json +56 -0
  34. package/skills/code-dev-review-fix-workspace/iteration-1/routing-results.md +23 -0
  35. package/skills/convert_pipeline/SKILL.md +423 -439
  36. package/skills/hmos-resources-convert/SKILL.md +623 -0
  37. package/skills/hmos-resources-convert/evals/evals.json +171 -0
  38. package/skills/hmos-resources-convert/references/conversion-rules.md +663 -0
  39. package/skills/hmos-resources-convert/references/dependency-analysis-rules.md +388 -0
  40. package/skills/hmos-resources-convert/references/resource-mapping-rules.md +457 -0
  41. package/skills/hmos-resources-convert/references/xml-drawable-to-svg-rules.md +513 -0
  42. package/skills/hmos-resources-convert/template/AppScope/app.json5 +10 -0
  43. package/skills/hmos-resources-convert/template/AppScope/resources/base/element/string.json +8 -0
  44. package/skills/hmos-resources-convert/template/AppScope/resources/base/media/background.png +0 -0
  45. package/skills/hmos-resources-convert/template/AppScope/resources/base/media/foreground.png +0 -0
  46. package/skills/hmos-resources-convert/template/AppScope/resources/base/media/layered_image.json +7 -0
  47. package/skills/hmos-resources-convert/template/build-profile.json5 +42 -0
  48. package/skills/hmos-resources-convert/template/code-linter.json5 +32 -0
  49. package/skills/hmos-resources-convert/template/entry/build-profile.json5 +33 -0
  50. package/skills/hmos-resources-convert/template/entry/hvigorfile.ts +6 -0
  51. package/skills/hmos-resources-convert/template/entry/obfuscation-rules.txt +23 -0
  52. package/skills/hmos-resources-convert/template/entry/oh-package.json5 +10 -0
  53. package/skills/hmos-resources-convert/template/entry/src/main/ets/entryability/EntryAbility.ets +48 -0
  54. package/skills/hmos-resources-convert/template/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +16 -0
  55. package/skills/hmos-resources-convert/template/entry/src/main/ets/pages/Index.ets +23 -0
  56. package/skills/hmos-resources-convert/template/entry/src/main/module.json5 +55 -0
  57. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/color.json +8 -0
  58. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/float.json +8 -0
  59. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/string.json +16 -0
  60. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/background.png +0 -0
  61. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/foreground.png +0 -0
  62. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/layered_image.json +7 -0
  63. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/startIcon.png +0 -0
  64. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/profile/backup_config.json +3 -0
  65. package/skills/hmos-resources-convert/template/entry/src/main/resources/base/profile/main_pages.json +5 -0
  66. package/skills/hmos-resources-convert/template/entry/src/main/resources/dark/element/color.json +8 -0
  67. package/skills/hmos-resources-convert/template/entry/src/mock/mock-config.json5 +2 -0
  68. package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/Ability.test.ets +35 -0
  69. package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/List.test.ets +5 -0
  70. package/skills/hmos-resources-convert/template/entry/src/ohosTest/module.json5 +16 -0
  71. package/skills/hmos-resources-convert/template/entry/src/test/List.test.ets +5 -0
  72. package/skills/hmos-resources-convert/template/entry/src/test/LocalUnit.test.ets +33 -0
  73. package/skills/hmos-resources-convert/template/hvigor/hvigor-config.json5 +23 -0
  74. package/skills/hmos-resources-convert/template/hvigorfile.ts +6 -0
  75. package/skills/hmos-resources-convert/template/oh-package-lock.json5 +28 -0
  76. package/skills/hmos-resources-convert/template/oh-package.json5 +10 -0
  77. package/skills/hmos-resources-convert/tools/apktool.bat +85 -0
  78. package/skills/hmos-resources-convert/tools/apktool_3.0.1.jar +0 -0
  79. package/skills/hmos-ui-align/SKILL.md +182 -0
  80. package/skills/hmos-ui-align/config-example.json +11 -0
  81. package/skills/hmos-ui-align/config.json +11 -0
  82. package/skills/hmos-ui-align/diff_analysis.md +53 -0
  83. package/skills/hmos-ui-align/page_align.md +62 -0
  84. package/skills/hmos-ui-align/readme.md +231 -0
  85. package/skills/hmos-ui-align/references/Comparison_Template.md +2 -0
  86. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Link/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/217/214/345/220/221/345/220/214/346/255/245.md +648 -0
  87. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Observed/350/243/205/351/245/260/345/231/250/345/222/214@ObjectLink/350/243/205/351/245/260/345/231/250/357/274/232/345/265/214/345/245/227/347/261/273/345/257/271/350/261/241/345/261/236/346/200/247/345/217/230/345/214/226.md +2089 -0
  88. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Prop/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/215/225/345/220/221/345/220/214/346/255/245.md +1033 -0
  89. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Provide/350/243/205/351/245/260/345/231/250/345/222/214@Consume/350/243/205/351/245/260/345/231/250/357/274/232/344/270/216/345/220/216/344/273/243/347/273/204/344/273/266/345/217/214/345/220/221/345/220/214/346/255/245.md +1183 -0
  90. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@State/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/206/205/347/212/266/346/200/201.md +576 -0
  91. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Track/350/243/205/351/245/260/345/231/250/357/274/232class/345/257/271/350/261/241/345/261/236/346/200/247/347/272/247/346/233/264/346/226/260.md +297 -0
  92. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Watch/350/243/205/351/245/260/345/231/250/357/274/232/347/212/266/346/200/201/345/217/230/351/207/217/346/233/264/346/224/271/351/200/232/347/237/245.md +395 -0
  93. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/AppStorage/357/274/232/345/272/224/347/224/250/345/205/250/345/261/200/347/232/204UI/347/212/266/346/200/201/345/255/230/345/202/250.md +903 -0
  94. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/Environment/357/274/232/350/256/276/345/244/207/347/216/257/345/242/203/346/237/245/350/257/242.md +106 -0
  95. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/LocalStorage/357/274/232/351/241/265/351/235/242/347/272/247UI/347/212/266/346/200/201/345/255/230/345/202/250.md +1178 -0
  96. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/MVVM/346/250/241/345/274/217V1.md +911 -0
  97. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md +911 -0
  98. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/PersistentStorage/357/274/232/346/214/201/344/271/205/345/214/226/345/255/230/345/202/250UI/347/212/266/346/200/201.md +355 -0
  99. package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243//347/256/241/347/220/206/345/272/224/347/224/250/346/213/245/346/234/211/347/232/204/347/212/266/346/200/201/346/246/202/350/277/260.md +11 -0
  100. package/skills/hmos-ui-align/references/UI_Analysis_Template.md +4 -0
  101. package/skills/hmos-ui-align/references/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2535 -0
  102. package/skills/hmos-ui-align/references/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -0
  103. package/skills/hmos-ui-align/references/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -0
  104. package/skills/hmos-ui-align/scripts/app_feature_verify.py +443 -0
  105. package/skills/hmos-ui-align/scripts/navigation-capure.md +37 -0
  106. package/skills/hmos-ui-align/scripts/page_capture.py +592 -0
  107. package/skills/hmos-ui-align-batch/SKILL.md +99 -0
  108. package/skills/hmos-ui-align-batch/references/conversion-procedure.md +180 -0
  109. package/skills/hmos-ui-align-batch/references/mappings/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2535 -0
  110. package/skills/hmos-ui-align-batch/references/mappings/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -0
  111. package/skills/hmos-ui-align-batch/references/mappings/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -0
  112. package/skills/hmos-ui-align-batch/references/mvvm/@Link/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/217/214/345/220/221/345/220/214/346/255/245.md +648 -0
  113. package/skills/hmos-ui-align-batch/references/mvvm/@Observed/350/243/205/351/245/260/345/231/250/345/222/214@ObjectLink/350/243/205/351/245/260/345/231/250/357/274/232/345/265/214/345/245/227/347/261/273/345/257/271/350/261/241/345/261/236/346/200/247/345/217/230/345/214/226.md +2089 -0
  114. package/skills/hmos-ui-align-batch/references/mvvm/@Prop/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/215/225/345/220/221/345/220/214/346/255/245.md +1033 -0
  115. package/skills/hmos-ui-align-batch/references/mvvm/@Provide/350/243/205/351/245/260/345/231/250/345/222/214@Consume/350/243/205/351/245/260/345/231/250/357/274/232/344/270/216/345/220/216/344/273/243/347/273/204/344/273/266/345/217/214/345/220/221/345/220/214/346/255/245.md +1183 -0
  116. package/skills/hmos-ui-align-batch/references/mvvm/@State/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/206/205/347/212/266/346/200/201.md +576 -0
  117. package/skills/hmos-ui-align-batch/references/mvvm/@Track/350/243/205/351/245/260/345/231/250/357/274/232class/345/257/271/350/261/241/345/261/236/346/200/247/347/272/247/346/233/264/346/226/260.md +297 -0
  118. package/skills/hmos-ui-align-batch/references/mvvm/@Watch/350/243/205/351/245/260/345/231/250/357/274/232/347/212/266/346/200/201/345/217/230/351/207/217/346/233/264/346/224/271/351/200/232/347/237/245.md +395 -0
  119. package/skills/hmos-ui-align-batch/references/mvvm/AppStorage/357/274/232/345/272/224/347/224/250/345/205/250/345/261/200/347/232/204UI/347/212/266/346/200/201/345/255/230/345/202/250.md +903 -0
  120. package/skills/hmos-ui-align-batch/references/mvvm/Environment/357/274/232/350/256/276/345/244/207/347/216/257/345/242/203/346/237/245/350/257/242.md +106 -0
  121. package/skills/hmos-ui-align-batch/references/mvvm/LocalStorage/357/274/232/351/241/265/351/235/242/347/272/247UI/347/212/266/346/200/201/345/255/230/345/202/250.md +1178 -0
  122. package/skills/hmos-ui-align-batch/references/mvvm/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md +911 -0
  123. package/skills/hmos-ui-align-batch/references/mvvm/PersistentStorage/357/274/232/346/214/201/344/271/205/345/214/226/345/255/230/345/202/250UI/347/212/266/346/200/201.md +355 -0
  124. package/skills/hmos-ui-align-batch/references/mvvm//347/256/241/347/220/206/345/272/224/347/224/250/346/213/245/346/234/211/347/232/204/347/212/266/346/200/201/346/246/202/350/277/260.md +11 -0
  125. package/skills/hmos-ui-align-batch/scripts/android_parse_fast.py +1606 -0
  126. package/skills/self-test/SKILL.md +369 -0
  127. package/skills/self-test/readme.md +309 -0
  128. package/skills/spec-generator-skill/SKILL.md +332 -0
  129. package/skills/spec-generator-skill/references/android-platform-tokens.md +105 -0
  130. package/skills/spec-generator-skill/references/spec-sample-1.md +78 -0
  131. package/skills/spec-generator-skill/references/spec-sample-2.md +58 -0
  132. package/skills/spec-generator-skill/references/spec-sample-3.md +116 -0
  133. package/skills/spec-generator-skill/references/step4-report-template.md +33 -0
  134. package/agents/self-test-setup.md +0 -165
  135. package/dist/context/resources/sdkConfig.json +0 -24
  136. package/src/context/resources/sdkConfig.json +0 -24
@@ -0,0 +1,555 @@
1
+ # Android-to-HarmonyOS UI Interaction Mapping Reference
2
+
3
+ <!-- TODO: Fill in the actual UI interaction mapping content -->
4
+ <!-- This reference maps Android UI interaction patterns to HarmonyOS ArkUI equivalents -->
5
+ <!-- Covers: onClick→.onClick(), onLongClick→LongPressGesture, swipe→SwipeGesture, TextWatcher→onChange, onScroll, Drag&Drop, animations, etc. -->
6
+
7
+
8
+
9
+
10
+ ## 一、触摸事件映射
11
+
12
+ ### 1.1 基础触摸事件
13
+
14
+ | Android 事件 | HarmonyOS 事件 | 映射说明 | 代码示例对比 |
15
+ |-------------|---------------|----------|-------------|
16
+ | `onTouchEvent(MotionEvent)` | `onTouch(event: TouchEvent)` | 直接映射 | Android: `view.onTouchEvent(event)`<br/>HarmonyOS: `Component().onTouch((event) => {})` |
17
+ | `onInterceptTouchEvent(MotionEvent)` | `onTouchIntercept(event: TouchEvent)` | 直接映射 | Android: `viewGroup.onInterceptTouchEvent(event)`<br/>HarmonyOS: `Container().onTouchIntercept((event) => {})` |
18
+ | `dispatchTouchEvent(MotionEvent)` | 事件分发机制 | 架构差异 | Android: 手动分发<br/>HarmonyOS: 自动分发 + 手势系统 |
19
+
20
+ ### 1.2 MotionEvent 动作映射
21
+
22
+ | Android Action | HarmonyOS 触摸类型 | 映射说明 |
23
+ |---------------|-------------------|----------|
24
+ | `ACTION_DOWN` | `TouchType.Down` | 手指按下 |
25
+ | `ACTION_UP` | `TouchType.Up` | 手指抬起 |
26
+ | `ACTION_MOVE` | `TouchType.Move` | 手指移动 |
27
+ | `ACTION_CANCEL` | `TouchType.Cancel` | 事件取消 |
28
+ | `ACTION_POINTER_DOWN` | 多点触摸开始 | 新手指按下 |
29
+ | `ACTION_POINTER_UP` | 多点触摸结束 | 手指抬起 |
30
+ | `ACTION_OUTSIDE` | 触摸区域外 | 触摸在组件外 |
31
+
32
+ ### 1.3 触摸事件属性映射(API 20/21)
33
+
34
+ | Android 属性 | HarmonyOS 属性 | 映射说明 |
35
+ |-------------|---------------|----------|
36
+ | `event.getX()` / `event.getY()` | `event.touches[0].x` / `event.touches[0].y` | 获取坐标 |
37
+ | `event.getRawX()` / `event.getRawY()` | `event.touches[0].screenX` / `event.touches[0].screenY` | 获取屏幕坐标 |
38
+ | `event.getPointerCount()` | `event.touches.length` | 触摸点数量 |
39
+ | `event.getPointerId(index)` | `event.touches[index].id` | 触摸点 ID |
40
+ | `event.getPressure()` | `event.touches[0].pressure` | 压力值 |
41
+ | `event.getSize()` | `event.touches[0].toolType` | 触摸工具类型 |
42
+ | `event.getEventTime()` | `event.timestamp` | 事件时间戳 |
43
+ | `event.getSource()` | 无直接对应 | 输入源判断需自定义 |
44
+
45
+ ### 1.4 响应热区设置(API 20/21 新增)
46
+
47
+ | Android 功能 | HarmonyOS 功能 | 映射说明 | 代码示例 |
48
+ |-------------|---------------|----------|---------|
49
+ | `setTouchDelegate()` | `responseRegion` | 扩展响应热区 | `Component().responseRegion({ x: '10%', y: '10%', width: '80%', height: '80%' })` |
50
+ | 无直接对应 | `responseRegion` | 热区可配置多个区域 | 支持设置一个或多个热区范围 |
51
+ | 无直接对应 | `responseRegion` | 百分比偏移 | x/y 可设置正负值百分比 |
52
+
53
+ ### 1.5 触摸测试控制(API 20/21 新增)
54
+
55
+ | Android 功能 | HarmonyOS 功能 | 映射说明 | 代码示例 |
56
+ |-------------|---------------|----------|---------|
57
+ | `requestDisallowInterceptTouchEvent()` | `hitTestBehavior` | 阻止拦截(静态配置) | `Component().hitTestBehavior(HitTestMode.None)` |
58
+ | `onInterceptTouchEvent()` | `onTouchIntercept()` | 事件拦截(动态回调) | `Container().onTouchIntercept((event) => { /* 返回 HitTestMode */ })` |
59
+ | 无直接对应 | `HitTestMode.Default` | 默认:自身命中会阻塞兄弟组件 | API 7+ |
60
+ | 无直接对应 | `HitTestMode.None` | 自身不接收事件,不阻塞 | API 7+ |
61
+ | 无直接对应 | `HitTestMode.Block` | 阻塞子组件的触摸测试 | API 7+ |
62
+ | 无直接对应 | `HitTestMode.Transparent` | 自身触摸测试,不阻塞 | API 7+ |
63
+ | 无直接对应 | `HitTestMode.BLOCK_HIERARCHY`(API 20 新增)| 自身和子节点响应,阻止祖先 | API 20+ |
64
+ | 无直接对应 | `HitTestMode.BLOCK_DESCENDANTS`(API 20 新增)| 自身不响应,后代也不响应 | API 20+ |
65
+
66
+ ### 1.6 事件冒泡与阻止(API 20/21 增强)
67
+
68
+ | Android 机制 | HarmonyOS 机制 | 映射说明 | 代码示例对比 |
69
+ |-------------|---------------|----------|-------------|
70
+ | 无直接 API | `stopPropagation()` | 停止事件冒泡 | HarmonyOS: `event.stopPropagation()`(API 21+) |
71
+ | 无直接 API | 事件冒泡机制 | 默认冒泡到父组件 | 遵循右子树优先的后序遍历 |
72
+ | 手势和事件独立 | 手势事件冒泡不影响基础事件 | stopPropagation 只停止 Touch 事件,不影响手势 | 需要注意 |
73
+
74
+ ---
75
+
76
+ ## 二、点击事件映射
77
+
78
+ ### 2.1 基础点击事件
79
+
80
+ | Android 事件 | HarmonyOS 事件 | 映射说明 | 代码示例对比 |
81
+ |-------------|---------------|----------|-------------|
82
+ | `OnClickListener.onClick(View)` | `onClick(() => {})` | 直接映射 | Android: `button.setOnClickListener { }`<br/>HarmonyOS: `Button().onClick(() => {})` |
83
+ | `OnLongClickListener.onLongClick(View)` | `onLongPress()` 手势 | 手势识别 | Android: `button.setOnLongClickListener { }`<br/>HarmonyOS: `Button().gesture(LongPressGesture().onAction(() => {}))` |
84
+ | `OnDoubleClickListener` | `TapGesture({count: 2})` | 手势识别 | Android: 自定义实现<br/>HarmonyOS: `Component().gesture(TapGesture({count: 2}).onAction(() => {}))` |
85
+ | `OnContextClickListener` | `BindContextMenu` | 上下文菜单 | Android: `view.setOnContextClickListener { }`<br/>HarmonyOS: `Component().bindContextMenu(this.menuBuilder)` |
86
+
87
+ ---
88
+
89
+ ## 三、手势识别映射
90
+
91
+ ### 3.1 点击手势
92
+
93
+ | Android 手势 | HarmonyOS 手势 | 映射说明 | 参数映射 |
94
+ |-------------|---------------|----------|---------|
95
+ | `GestureDetector.OnSingleTapUpListener` | `TapGesture({count: 1})` | 单击 | count: 1 |
96
+ | `GestureDetector.OnDoubleTapListener` | `TapGesture({count: 2})` | 双击 | count: 2 |
97
+ | `GestureDetector.OnShowPressListener` | `TapGesture` + 延时 | 长按触发 | 需自定义延时 |
98
+ | 手指按下 | `TapGesture` onAction | 动作回调 | `onAction(() => {})` |
99
+
100
+ ### 3.2 长按手势
101
+
102
+ | Android 手势 | HarmonyOS 手势 | 映射说明 | 代码示例 |
103
+ |-------------|---------------|----------|---------|
104
+ | `GestureDetector.OnLongPressListener` | `LongPressGesture` | 长按 | `Component().gesture(LongPressGesture().onAction(() => {}))` |
105
+ | `onLongPress(MotionEvent)` | `LongPressGesture` onAction | 长按动作 | `onAction(() => { /* 长按触发 */ })` |
106
+
107
+ ### 3.3 拖动手势
108
+
109
+ | Android 手势 | HarmonyOS 手势 | 映射说明 | 参数映射 |
110
+ |-------------|---------------|----------|---------|
111
+ | `GestureDetector.OnScrollListener` | `PanGesture` | 滑动/拖动 | direction: PanDirection |
112
+ | `onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)` | `PanGesture` onAction | 滑动动作 | `onAction((event: GestureEvent) => { /* 处理滑动 */ })` |
113
+ | `onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)` | `SwipeGesture` | 快速滑动 | 需要速度阈值判断 |
114
+
115
+ ### 3.4 缩放手势
116
+
117
+ | Android 手势 | HarmonyOS 手势 | 映射说明 | 参数映射 |
118
+ |-------------|---------------|----------|---------|
119
+ | `ScaleGestureDetector.OnScaleGestureListener` | `PinchGesture` | 双指缩放 | 需配合手势系统 |
120
+ | `onScale(ScaleGestureDetector detector)` | `PinchGesture` onAction | 缩放动作 | `onAction((event: GestureEvent) => { /* 处理缩放 */ })` |
121
+ | `onScaleBegin(ScaleGestureDetector detector)` | `PinchGesture` onActionStart | 缩放开始 | `onActionStart(() => {})` |
122
+ | `onScaleEnd(ScaleGestureDetector detector)` | `PinchGesture` onActionEnd | 缩放结束 | `onActionEnd(() => {})` |
123
+
124
+ ### 3.5 旋转手势
125
+
126
+ | Android 手势 | HarmonyOS 手势 | 映射说明 | 代码示例 |
127
+ |-------------|---------------|----------|---------|
128
+ | 无直接对应(需自定义) | `RotationGesture` | 双指旋转 | `Component().gesture(RotationGesture().onAction(() => {}))` |
129
+
130
+ ### 3.6 手势组合与冲突处理
131
+
132
+ | Android 机制 | HarmonyOS 机制 | 映射说明 |
133
+ |-------------|---------------|----------|
134
+ | GestureDetector 组合 | `GestureGroup` | 手势组合识别 |
135
+ | 手势冲突处理 | `GestureMask` | 手势响应模式控制 |
136
+ | 事件拦截 onInterceptTouchEvent | `onTouchIntercept` | 触摸事件拦截 |
137
+
138
+ ---
139
+
140
+ ## 四、滑动与拖拽映射
141
+
142
+ ### 4.1 滑动手势
143
+
144
+ | Android 事件 | HarmonyOS 手势 | 映射说明 | 代码示例 |
145
+ |-------------|---------------|----------|---------|
146
+ | `OnPageChangeListener` | `SwiperController` + onChange | 页面滑动 | `Swiper().onChange((index) => {})` |
147
+ | `OnScrollChangeListener` | `Scroll` onScroll | 滚动监听 | `Scroll().onScroll((xOffset, yOffset) => {})` |
148
+ | `RecyclerView.OnScrollListener` | `List` onScroll | 列表滚动 | `List().onScroll((scrollOffset, scrollState) => {})` |
149
+
150
+ ### 4.2 拖拽功能
151
+
152
+ | Android 功能 | HarmonyOS 功能 | 映射说明 | 代码示例 |
153
+ |-------------|---------------|----------|---------|
154
+ | View.OnDragListener | `Drag` 装饰器 | 拖拽功能 | `Component().gesture(Drag())` |
155
+ | `onDrag(View v, DragEvent event)` | `Drag` onActionStart/onAction/onActionEnd | 拖拽事件 | `onActionStart(() => {})`<br/>`onAction((event) => {})`<br/>`onActionEnd(() => {})` |
156
+ | `startDragAndDrop()` | 无直接对应 | 系统拖拽 | 需自定义实现 |
157
+
158
+ ### 4.3 滑动删除
159
+
160
+ | Android 功能 | HarmonyOS 功能 | 映射说明 | 代码示例 |
161
+ |-------------|---------------|----------|---------|
162
+ | ItemTouchHelper Swipe | `SwipeGesture` + 状态 | 滑动删除 | `ListItem().gesture(SwipeGesture().onAction(() => { /* 删除逻辑 */ }))` |
163
+
164
+ ---
165
+
166
+ ## 五、焦点事件映射
167
+
168
+ ### 5.1 焦点获取与失去
169
+
170
+ | Android 事件 | HarmonyOS 事件 | 映射说明 | 代码示例对比 |
171
+ |-------------|---------------|----------|-------------|
172
+ | `OnFocusChangeListener.onFocusChange(View v, boolean hasFocus)` | `onFocus()` / `onBlur()` | 分离为两个事件 | Android: `view.onFocusChange { _, hasFocus -> }`<br/>HarmonyOS: `Component().onFocus(() => {}).onBlur(() => {})` |
173
+ | `setOnFocusChangeListener()` | `onFocus()` / `onBlur()` | 焦点变化监听 | `Component().onFocus(() => { /* 获得焦点 */ }).onBlur(() => { /* 失去焦点 */ })` |
174
+
175
+ ### 5.2 焦点请求与管理
176
+
177
+ | Android 功能 | HarmonyOS 功能 | 映射说明 | 代码示例对比 |
178
+ |-------------|---------------|----------|-------------|
179
+ | `requestFocus()` | `focusControl.requestFocus()` | 请求焦点 | Android: `editText.requestFocus()`<br/>HarmonyOS: `focusControl.requestFocus(this.input)` |
180
+ | `clearFocus()` | `focusControl.requestFocus(null)` | 清除焦点 | Android: `editText.clearFocus()`<br/>HarmonyOS: `focusControl.requestFocus(null)` |
181
+ | `isFocused()` | 组件属性 `focused` | 检查焦点状态 | Android: `view.isFocused()`<br/>HarmonyOS: 组件内部状态判断 |
182
+ | `findFocus()` | `focusControl.requestFocus()` | 查找焦点组件 | 功能相似,API不同 |
183
+
184
+ ### 5.3 焦点遍历
185
+
186
+ | Android 功能 | HarmonyOS 功能 | 映射说明 |
187
+ |-------------|---------------|----------|
188
+ | `FOCUS_DOWN` / `FOCUS_UP` / `FOCUS_LEFT` / `FOCUS_RIGHT` | 键盘方向键 | 方向键移动焦点 |
189
+ | `nextFocusDown` 等 XML 属性 | `focusable` 属性 | 焦点可获取性 |
190
+ | `FocusFinder.findNextFocus()` | 系统自动处理 | 下一个焦点查找 |
191
+
192
+ ### 5.4 焦点触发方式
193
+
194
+ | Android 特性 | HarmonyOS 特性 | 映射说明 |
195
+ |-------------|---------------|----------|
196
+ | 触摸自动获取焦点 | 默认不自动 | HarmonyOS 需设置 `focusOnTouch` 属性 |
197
+ | Tab 键切换焦点 | Tab 键切换焦点 | 默认行为一致 |
198
+ | 方向键移动焦点 | 方向键移动焦点 | 默认行为一致 |
199
+
200
+ ---
201
+
202
+ ## 六、键盘事件映射
203
+
204
+ ### 6.1 键盘输入事件
205
+
206
+ | Android 事件 | HarmonyOS 事件 | 映射说明 | 代码示例对比 |
207
+ |-------------|---------------|----------|-------------|
208
+ | `OnKeyListener.onKey(View v, int keyCode, KeyEvent event)` | `onKeyEvent(event: KeyEvent)` | 键盘事件 | Android: `view.setOnKeyListener { _, keyCode, _ -> }`<br/>HarmonyOS: `Component().onKeyEvent((event) => { /* 处理按键 */ })` |
209
+ | `dispatchKeyEvent(KeyEvent event)` | `onKeyEvent()` | 按键分发 | 功能类似 |
210
+
211
+ ### 6.2 键盘操作映射
212
+
213
+ | Android 键值 | HarmonyOS 键值 | 映射说明 |
214
+ |-------------|---------------|----------|
215
+ | `KeyEvent.KEYCODE_ENTER` | `KeyCode.ENTER` | 回车键 |
216
+ | `KeyEvent.KEYCODE_BACK` | `KeyCode.ESCAPE` | 返回键 |
217
+ | `KeyEvent.KEYCODE_DEL` | `KeyCode.DELETE` | 删除键 |
218
+ | `KeyEvent.KEYCODE_TAB` | `KeyCode.TAB` | Tab 键 |
219
+ | `KeyEvent.KEYCODE_DPAD_UP/DOWN/LEFT/RIGHT` | 方向键 | 方向键 |
220
+
221
+ ### 6.3 输入法相关
222
+
223
+ | Android 功能 | HarmonyOS 功能 | 映射说明 |
224
+ |-------------|---------------|----------|
225
+ | `InputMethodManager` | `InputMethod` | 输入法管理 |
226
+ | `showSoftInput()` / `hideSoftInput()` | `focusControl.requestFocus()` | 显示/隐藏键盘 |
227
+ | `IME_ACTION` 配置 | `enterKeyType` 属性 | 输入法操作类型 |
228
+
229
+ ---
230
+
231
+ ## 七、事件分发与拦截映射
232
+
233
+ ### 7.1 事件分发机制(API 20/21)
234
+
235
+ | Android 机制 | HarmonyOS 机制 | 映射说明 | 架构差异 |
236
+ |-------------|---------------|----------|---------|
237
+ | `dispatchTouchEvent()` | 自动分发系统 | Android 手动分发 | HarmonyOS 自动处理 |
238
+ | `onInterceptTouchEvent()` | `onTouchIntercept()` | 事件拦截 | 功能类似,API不同 |
239
+ | 事件响应链机制 | 事件响应链机制 | 事件传播 | HarmonyOS 基于触摸测试构建响应链(API 20/21) |
240
+
241
+ ### 7.2 事件冒泡与阻止(API 20/21)
242
+
243
+ | Android 机制 | HarmonyOS 机制 | 映射说明 | 代码示例对比 |
244
+ |-------------|---------------|----------|-------------|
245
+ | `requestDisallowInterceptTouchEvent(true)` | `onTouchIntercept` 返回 false | 阻止拦截 | Android: `parent.requestDisallowInterceptTouchEvent(true)`<br/>HarmonyOS: `Container().onTouchIntercept(() => false)` |
246
+ | `stopPropagation()` | `event.stopPropagation()` | 停止事件冒泡 | HarmonyOS: `event.stopPropagation()`(API 21+) |
247
+ | `return true` / `return false` | 事件消费 | 事件消费控制 | Android: `return true` 消费事件<br/>HarmonyOS: 绑定事件即消费 |
248
+
249
+ ### 7.3 手势拦截增强(API 20 新增)
250
+
251
+ | Android 功能 | HarmonyOS 功能 | 映射说明 | 代码示例 |
252
+ |-------------|---------------|----------|---------|
253
+ | 无直接对应 | `onGestureRecognizerJudgeBegin()` | 手势判断拦截 | `Component().onGestureRecognizerJudgeBegin(() => { /* 拦截手势判断 */ })` |
254
+ | 无直接对应 | `parallelGesture()` | 并行手势绑定 | 支持系统手势和自定义手势并行处理 |
255
+ | 无直接对应 | `手势拦截` | 动态控制手势触发 | 从 API 20 开始支持手势拦截能力 |
256
+
257
+ ### 7.4 事件响应链(API 20/21 核心特性)
258
+
259
+ | 概念 | Android | HarmonyOS | 说明 |
260
+ |-----|---------|-----------|------|
261
+ | 触摸测试 | 手动实现 | 自动基于坐标测试 | API 20/21 自动进行 |
262
+ | 响应链收集 | 递归遍历 | 右子树优先后序遍历 | 更高效的事件分发 |
263
+ | 事件分发 | dispatchTouchEvent | 自动分发系统 | 减少开发复杂度 |
264
+
265
+ ### 7.3 触摸冲突处理
266
+
267
+ | Android 问题 | HarmonyOS 解决方案 | 映射说明 | 参考文档 |
268
+ |-------------|-------------------|----------|---------|
269
+ | 父子组件触摸事件冲突 | `onTouch` + `onClick` 冲突解决 | 多层级事件处理 | [多层级手势事件官方文档](https://developer.huawei.com/consumer/cn/doc/HarmonyOS-Guides/arkts-gesture-events-multi-level-gesture) |
270
+ | Button onClick 父组件 onTouch 冲突 | `stopPropagation()` 或配置 | 事件优先级处理 | [onTouch与onClick事件冲突 FAQ](https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-arkui-174) |
271
+
272
+ ---
273
+
274
+ ## 八、生命周期事件映射
275
+
276
+ ### 8.1 组件生命周期
277
+
278
+ | Android 生命周期 | HarmonyOS 生命周期 | 映射说明 | 调用时机 |
279
+ |----------------|-------------------|----------|---------|
280
+ | `View.onAttachedToWindow()` | `aboutToAppear()` | 组件即将出现 | 组件挂载到 DOM 时 |
281
+ | `View.onDetachedFromWindow()` | `aboutToDisappear()` | 组件即将消失 | 组件从 DOM 卸载时 |
282
+ | `View.onVisibilityChanged()` | `visibility` 属性变化 | 可见性变化 | 组件显示/隐藏时 |
283
+
284
+ ### 8.2 页面生命周期
285
+
286
+ | Android 生命周期 | HarmonyOS 生命周期 | 映射说明 | 调用时机 |
287
+ |----------------|-------------------|----------|---------|
288
+ | `Activity.onCreate()` | `UIAbility.onCreate()` | 创建 | 页面创建时 |
289
+ | `Activity.onStart()` | `UIAbility.onForeground()` | 前台 | 页面进入前台时 |
290
+ | `Activity.onResume()` | `UIAbility.onForeground()` 内部处理 | 可交互 | 页面可交互时 |
291
+ | `Activity.onPause()` | `UIAbility.onBackground()` | 后台 | 页面进入后台时 |
292
+ | `Activity.onStop()` | `UIAbility.onBackground()` | 停止 | 页面停止时 |
293
+ | `Activity.onDestroy()` | `UIAbility.onDestroy()` | 销毁 | 页面销毁时 |
294
+
295
+ ### 8.3 页面显示与隐藏
296
+
297
+ | Android 事件 | HarmonyOS 事件 | 映射说明 | 代码示例 |
298
+ |-------------|---------------|----------|---------|
299
+ | `onWindowFocusChanged(boolean hasFocus)` | `onPageShow()` / `onPageHide()` | 窗口焦点变化 | `@Entry struct Page { onPageShow() { /* 页面显示 */ } onPageHide() { /* 页面隐藏 */ } }` |
300
+ | `onConfigurationChanged(Configuration newConfig)` | `onConfigurationUpdated(newConfig)` | 配置变化 | 配置(如屏幕方向)变化时调用 |
301
+
302
+ ---
303
+
304
+ ## 九、动画交互映射
305
+
306
+ ### 9.1 属性动画
307
+
308
+ | Android 动画 | HarmonyOS 动画 | 映射说明 | 代码示例对比 |
309
+ |-------------|---------------|----------|-------------|
310
+ | `ObjectAnimator.ofFloat(view, "translationX", 0, 100)` | `animateTo({ duration: 1000 }, () => { this.x = 100 })` | 属性动画 | Android: `ObjectAnimator.ofFloat(view, "translationX", 0, 100).start()`<br/>HarmonyOS: `animateTo({ duration: 1000 }, () => { this.x = 100 })` |
311
+ | `ValueAnimator.ofFloat(0, 100)` | `animateTo()` | 值动画 | Android: `ValueAnimator.ofFloat(0, 100)`<br/>HarmonyOS: `animateTo({ duration: 1000 }, () => { this.value = 100 })` |
312
+ | `AnimatorSet` | 组合 `animateTo` 调用 | 动画集合 | Android: `AnimatorSet.playTogether(animator1, animator2)`<br/>HarmonyOS: `animateTo({ duration: 1000 }, () => { this.x = 100; this.y = 200; })` |
313
+
314
+ ### 9.2 补间动画
315
+
316
+ | Android 动画 | HarmonyOS 动画 | 映射说明 | 代码示例对比 |
317
+ |-------------|---------------|----------|-------------|
318
+ | `TranslateAnimation` | `animateTo` + `translate` | 平移动画 | Android: `TranslateAnimation(0, 100, 0, 0)`<br/>HarmonyOS: `Component().translate({ x: this.x }).animation({ duration: 1000 })` |
319
+ | `ScaleAnimation` | `animateTo` + `scale` | 缩放动画 | Android: `ScaleAnimation(1, 1.5f, 1, 1.5f)`<br/>HarmonyOS: `Component().scale({ x: this.scale }).animation({ duration: 1000 })` |
320
+ | `RotateAnimation` | `animateTo` + `rotate` | 旋转动画 | Android: `RotateAnimation(0, 360)`<br/>HarmonyOS: `Component().rotate({ angle: this.angle }).animation({ duration: 1000 })` |
321
+ | `AlphaAnimation` | `animateTo` + `opacity` | 透明度动画 | Android: `AlphaAnimation(1, 0)`<br/>HarmonyOS: `Component().opacity(this.opacity).animation({ duration: 1000 })` |
322
+
323
+ ### 9.3 转场动画
324
+
325
+ | Android 转场 | HarmonyOS 转场 | 映射说明 | 代码示例对比 |
326
+ |-------------|---------------|----------|-------------|
327
+ | `ActivityOptions.makeCustomAnimation()` | `pageTransition()` | 页面转场 | Android: `startActivity(intent, options.toBundle())`<br/>HarmonyOS: `@Entry @Component struct Page { pageTransition() { PageTransitionEnter({ type: RouteType.None, duration: 1000 }).slide({ type: SlideEffect.Right }) } }` |
328
+ | `SharedElementCallback` | `sharedTransition()` | 共享元素转场 | Android: `ActivityOptions.makeSceneTransitionAnimation()`<br/>HarmonyOS: `Component().sharedTransition('id', { duration: 1000 })` |
329
+ | `Transition` | `transition` | 组件转场 | Android: `TransitionSet`<br/>HarmonyOS: `if (this.show) { Component().transition({ type: TransitionType.All, opacity: 0 }) }` |
330
+
331
+ ### 9.4 动画监听器
332
+
333
+ | Android 监听器 | HarmonyOS 监听器 | 映射说明 | 代码示例对比 |
334
+ |-------------|---------------|----------|-------------|
335
+ | `Animator.AnimatorListener` | `AnimatorResult` 回调 | 动画生命周期 | Android: `animator.addListener(object: Animator.AnimatorListener { override fun onAnimationStart(animation: Animator) {} override fun onAnimationEnd(animation: Animator) {} })`<br/>HarmonyOS: `animateTo({ duration: 1000, onFinish: () => { /* 动画结束 */ } }, () => { /* 动画内容 */ })` |
336
+ | `ValueAnimator.AnimatorUpdateListener` | `AnimatorResult` 回调 | 动画更新 | Android: `valueAnimator.addUpdateListener { animation -> val value = animation.animatedValue as Float }`<br/>HarmonyOS: 状态自动更新,无需回调 |
337
+
338
+ ### 9.5 动画控制
339
+
340
+ | Android 功能 | HarmonyOS 功能 | 映射说明 | 代码示例对比 |
341
+ |-------------|---------------|----------|-------------|
342
+ | `animator.start()` | `animateTo()` 自动执行 | 启动动画 | Android: `animator.start()`<br/>HarmonyOS: `animateTo({}, () => { /* 状态变化即启动 */ })` |
343
+ | `animator.cancel()` | `AnimatorResult.cancel()` | 取消动画 | Android: `animator.cancel()`<br/>HarmonyOS: `animatorResult.cancel()` |
344
+ | `animator.pause()` | 无直接对应 | 暂停动画 | HarmonyOS 需自定义实现 |
345
+ | `animator.resume()` | 无直接对应 | 恢复动画 | HarmonyOS 需自定义实现 |
346
+
347
+ ---
348
+
349
+ ## 十、拖放功能映射
350
+
351
+ ### 10.1 拖拽系统
352
+
353
+ | Android 功能 | HarmonyOS 功能 | 映射说明 | 代码示例对比 |
354
+ |-------------|---------------|----------|-------------|
355
+ | `View.startDragAndDrop()` | `Drag` 装饰器 | 拖拽启动 | Android: `view.startDragAndDrop(clipData, myShadow, null, 0)`<br/>HarmonyOS: `Component().gesture(Drag())` |
356
+ | `OnDragListener` | `Drag` 回调 | 拖拽监听 | Android: `view.setOnDragListener { _, event -> when (event.action) { DragEvent.ACTION_DROP -> } }`<br/>HarmonyOS: `Component().gesture(Drag().onActionStart(() => {}).onAction((event) => {}).onActionEnd(() => {}))` |
357
+ | `DragEvent.ACTION_DRAG_STARTED` | `Drag` onActionStart | 拖拽开始 | `onActionStart(() => { /* 拖拽开始 */ })` |
358
+ | `DragEvent.ACTION_DRAG_LOCATION` | `Drag` onAction | 拖拽进行中 | `onAction((event: GestureEvent) => { /* 拖拽位置 */ })` |
359
+ | `DragEvent.ACTION_DROP` | `Drop` 装饰器 | 放置 | `Component().gesture(Drop().onDrop((event) => { /* 处理放置 */ }))` |
360
+
361
+ ### 10.2 放置目标
362
+
363
+ | Android 功能 | HarmonyOS 功能 | 映射说明 | 代码示例 |
364
+ |-------------|---------------|----------|---------|
365
+ | `DragEvent.ACTION_DROP` | `Drop` onDrop | 放置目标 | `DropContainer().gesture(Drop().onDrop((event) => { /* 处理数据放置 */ }))` |
366
+ | `ClipData` 传递 | `Drop` event 参数 | 数据传递 | 通过 gesture event 传递数据 |
367
+
368
+ ---
369
+
370
+ ## 十一、无障碍功能映射
371
+
372
+ ### 11.1 无障碍属性
373
+
374
+ | Android 属性 | HarmonyOS 属性 | 映射说明 | 代码示例对比 |
375
+ |-------------|---------------|----------|-------------|
376
+ | `setContentDescription(CharSequence)` | `accessibilityText` | 无障碍文本 | Android: `view.setContentDescription("描述文本")`<br/>HarmonyOS: `Component().accessibilityText("描述文本")` |
377
+ | `setImportantForAccessibility(int)` | `accessibilityLevel` | 无障碍重要性 | Android: `view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES)`<br/>HarmonyOS: `Component().accessibilityLevel(AccessibilityLevel.AUTO)` |
378
+ | `setAccessibilityDelegate()` | 无直接对应 | 无障碍代理 | 需自定义实现 |
379
+ | `announceForAccessibility(CharSequence)` | 无直接对应 | 公告通知 | 需使用系统 API |
380
+
381
+ ---
382
+
383
+ ## 十二、未找到直接对应方案的 UI 交互功能(API 20/21 更新)
384
+
385
+ 以下 Android UI 交互功能在 HarmonyOS ArkUI 中暂无直接对应功能:
386
+
387
+ | Android 功能 | HarmonyOS 替代方案 | 难度等级 | 说明 |
388
+ |-------------|-------------------|---------|------|
389
+ | **拖放系统** | | | |
390
+ | `ClipData` 系统拖放 | 自定义拖拽 | 困难 | HarmonyOS 没有 ClipData 系统,需自定义数据传递 |
391
+ | `DragEvent.ACTION_DRAG_ENTERED/EXITED` | 自定义边界检测 | 中等 | 需手动判断拖拽进入/离开区域 |
392
+ | **高级焦点功能** | | | |
393
+ | `FocusFinder` 查找算法 | `focusControl` API | 中等 | 系统自动处理,无手动查找需求 |
394
+ | `setOnFocusChangeListener` 的精确时机 | `onFocus` / `onBlur` | 简单 | 时机略有差异,需调整逻辑 |
395
+ | **触摸事件细节** | | | |
396
+ | `MotionEvent.getToolType()` | `toolType` 属性 | 简单 | 部分支持,工具类型有限 |
397
+ | `MotionEvent.getAxisValue()` | 无直接对应 | 中等 | 手柄、滚轮等高级输入暂不支持 |
398
+ | `MotionEvent.getSource()` | 无直接对应 | 中等 | 输入源判断需自定义 |
399
+ | **手势冲突高级处理** | | | |
400
+ | `onInterceptTouchEvent()` 嵌套拦截 | `onTouchIntercept` 级联 | 简单 | API 20/21 提供了更强大的拦截机制 |
401
+ | **动画高级功能** | | | |
402
+ | `Animator.pause()` / `resume()` | 自定义状态管理 | 中等 | 需要手动控制动画状态 |
403
+ | `AnimatorListener.onAnimationRepeat()` | 自定义重复逻辑 | 中等 | HarmonyOS 无重复回调,需手动实现 |
404
+ | `LayoutTransition` | 自定义布局动画 | 困难 | 需要监听组件添加/删除 |
405
+ | `ViewPropertyAnimator` 组合 | 链式 `animateTo` | 简单 | 语法不同,功能类似 |
406
+ | **键盘事件细节** | | | |
407
+ | `KeyEvent` 完整事件体系 | `KeyEvent` 简化版 | 中等 | HarmonyOS 键盘事件较为简化 |
408
+ | `dispatchKeyShortcutEvent()` | 无直接对应 | 中等 | 快捷键处理需自定义 |
409
+ | `onKeyLongPress()` | 自定义延时判断 | 简单 | 需要计时逻辑 |
410
+ | **多窗口交互** | | | |
411
+ | `onMultiWindowModeChanged()` | 无直接对应 | 不可行 | HarmonyOS 无多窗口模式 |
412
+ | `onPictureInPictureModeChanged()` | 无直接对应 | 不可行 | HarmonyOS 无画中画模式 |
413
+
414
+ **注意**:API 20/21 已显著改进了事件处理能力,包括:
415
+ - 增强的 HitTestMode(BLOCK_HIERARCHY、BLOCK_DESCENDANTS)
416
+ - 手势拦截增强(onGestureRecognizerJudgeBegin)
417
+ - 事件响应链机制优化
418
+ - 响应热区 responseRegion 支持
419
+
420
+ ---
421
+
422
+ ## 十三、映射方案总结
423
+
424
+ ### 13.1 完全直接映射的交互功能(40+)
425
+
426
+ 可以直接一对一替换的交互功能:
427
+ - 基础触摸事件(onTouch)
428
+ - 点击事件(onClick)
429
+ - 焦点事件(onFocus/onBlur)
430
+ - 键盘事件(onKeyEvent)
431
+ - 基础手势(点击、长按)
432
+ - 动画 API(animateTo)
433
+
434
+ ### 13.2 需要调整的交互功能(30+)
435
+
436
+ 需要调整实现方式的交互功能:
437
+ - 手势识别(需使用手势系统而非监听器)
438
+ - 动画系统(声明式动画,状态驱动)
439
+ - 事件分发(自动分发 vs 手动分发)
440
+ - 生命周期(分离为多个回调)
441
+
442
+ ### 13.3 需要自定义实现的交互功能(15+)
443
+
444
+ 需要编写自定义逻辑或组件的交互功能:
445
+ - 系统拖放(需自定义数据传递)
446
+ - 高级焦点功能(系统自动处理)
447
+ - 动画暂停/恢复(需状态管理)
448
+ - 多窗口交互(架构不支持)
449
+
450
+ ### 13.4 API 20/21 新增改进
451
+
452
+ API 20/21 带来了以下重要改进:
453
+ - **响应热区支持**:`responseRegion` 属性,可扩展组件响应范围
454
+ - **增强的触摸测试控制**:`HitTestMode.BLOCK_HIERARCHY`、`HitTestMode.BLOCK_DESCENDANTS`
455
+ - **手势拦截增强**:`onGestureRecognizerJudgeBegin()`、`parallelGesture()`
456
+ - **事件响应链优化**:更高效的事件分发机制
457
+ - **stopPropagation()**:更灵活的事件冒泡控制
458
+
459
+ ---
460
+
461
+ ## 十四、迁移建议
462
+
463
+ ### 14.1 交互功能迁移优先级
464
+
465
+ 1. **高优先级**(完全支持):
466
+ - 点击事件、长按事件
467
+ - 基础手势(点击、长按、拖动)
468
+ - 焦点事件、键盘事件
469
+ - 基础动画
470
+
471
+ 2. **中优先级**(部分支持):
472
+ - 复杂手势(缩放、旋转)
473
+ - 事件分发与拦截
474
+ - 转场动画
475
+ - 无障碍功能
476
+
477
+ 3. **低优先级**(暂不支持或困难):
478
+ - 系统拖放
479
+ - 多窗口交互
480
+ - 高级键盘事件
481
+ - 动画暂停/恢复
482
+
483
+ ### 14.2 交互功能迁移策略
484
+
485
+ 1. **声明式思维转换**:
486
+ - Android:命令式,监听器 + 回调
487
+ - HarmonyOS:声明式,状态 + 绑定
488
+ - 需要改变编程范式
489
+
490
+ 2. **手势系统优先**:
491
+ - 优先使用 HarmonyOS 手势系统(TapGesture、PanGesture 等)
492
+ - 避免在 onTouch 中手动解析手势
493
+
494
+ 3. **状态驱动动画**:
495
+ - 动画通过状态变化触发
496
+ - 使用 @State 装饰器管理动画状态
497
+
498
+ 4. **事件冒泡处理**:
499
+ - 理解 HarmonyOS 事件冒泡机制
500
+ - 合理使用 stopPropagation()
501
+
502
+ ### 14.3 注意事项
503
+
504
+ 1. **事件模型差异**:
505
+ - Android:事件分发机制复杂
506
+ - HarmonyOS:手势系统更简洁
507
+
508
+ 2. **焦点处理方式**:
509
+ - Android:复杂的焦点查找和管理
510
+ - HarmonyOS:focusControl API 简化
511
+
512
+ 3. **动画架构差异**:
513
+ - Android:基于对象的动画系统
514
+ - HarmonyOS:基于状态的声明式动画
515
+
516
+ 4. **手势识别方式**:
517
+ - Android:GestureDetector + 监听器
518
+ - HarmonyOS:手势装饰器 + 回调
519
+
520
+ 5. **测试重点**:
521
+ - 多点触控场景
522
+ - 手势冲突处理
523
+ - 性能优化(避免过度重绘)
524
+
525
+ ---
526
+
527
+ ## 参考链接
528
+
529
+ ### Android 官方文档
530
+ 1. **[处理多点触控手势 | Android Developers](https://developer.android.com/develop/ui/views/touch-and-input/gestures/multi?hl=zh-cn)**
531
+ 2. **[检测常用手势 | Android Developers](https://developer.android.com/develop/ui/views/touch-and-input/gestures/detector?hl=zh-cn)**
532
+ 3. **[了解手势 | Jetpack Compose](https://android-docs.cn/develop/ui/compose/touch-input/pointer-input/understand-gestures)**
533
+ 4. **[ViewGroup中管理触摸事件 | Android Developers](https://developer.android.com/develop/ui/views/touch-and-input/gestures/viewgroup?hl=zh-cn)**
534
+ 5. **[属性动画概览 | Android Developers](https://developer.android.com/develop/ui/views/animations/prop-animation?hl=zh-cn)**
535
+ 6. **[Android 触摸手势基础官方文档概览](https://www.cnblogs.com/mengdd/p/3335508.html)**
536
+ 7. **[Android 手势识别类 GestureDetector 基本介绍](https://developer.aliyun.com/article/569712)**
537
+
538
+ ### HarmonyOS 官方文档
539
+ 1. **[多层级手势事件官方文档](https://developer.huawei.com/consumer/cn/doc/HarmonyOS-Guides/arkts-gesture-events-multi-level-gesture)**
540
+ 2. **[焦点事件](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-focus-event)**
541
+ 3. **[焦点处理指南](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-common-events-focus-event)**
542
+ 4. **[转场动画](https://developer.huawei.com/consumer/cn/doc/HarmonyOS-Guides/arkts-animation-transition)**
543
+ 5. **[显式动画(animateTo)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-explicit-animation)**
544
+ 6. **[焦点事件onBlur/onFocus回调无法触发](https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-arkui-165)**
545
+ 7. **[onTouch与onClick事件冲突 FAQ](https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-arkui-174)**
546
+
547
+ ### 技术博客与实战文章
548
+ 1. **[ArkUI交互事件与手势处理全解析](https://blog.csdn.net/2301_79624024/article/details/147620496)** - HarmonyOS 手势处理
549
+ 2. **[触摸事件机制深入解析](https://segmentfault.com/a/1190000047072887)** - Android 触摸事件详解
550
+ 3. **[Android触摸事件分发、手势识别与输入优化实战](https://juejin.cn/post/7611830146089615406)** - 事件分发机制
551
+ 4. **[探秘Android手势事件机制与优化技巧](https://juejin.cn/post/7238869983621611576)** - 手势事件机制
552
+
553
+ ---
554
+
555
+ *本文档基于 Android 14 和 HarmonyOS NEXT API 20/21 (6.0.0/6.0.1) 整理,具体 API 以官方最新文档为准。UI 交互功能的映射涉及复杂的编程范式转换和 API 20/21 新增的事件响应链机制,建议在实际迁移中结合具体场景灵活应用。*