@quicktvui/ai 1.0.7 → 1.0.8

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 (204) hide show
  1. package/package.json +1 -1
  2. package/rules/.clinerules +27 -4
  3. package/rules/.cursorrules +27 -4
  4. package/rules/.github/copilot-instructions.md +27 -4
  5. package/rules/.source/hippy/extend_views/CoverFlowHorizontalView.java +203 -0
  6. package/rules/.source/hippy/extend_views/CoverFlowVerticalView.java +203 -0
  7. package/rules/.source/hippy/extend_views/CoverFlowViewController.java +195 -0
  8. package/rules/.source/hippy/extend_views/EngineRootView.java +125 -0
  9. package/rules/.source/hippy/extend_views/ExtendTag.java +83 -0
  10. package/rules/.source/hippy/extend_views/FocusSearchHelper.java +124 -0
  11. package/rules/.source/hippy/extend_views/IRecyclerItemView.java +12 -0
  12. package/rules/.source/hippy/extend_views/JSEventHandleView.java +5 -0
  13. package/rules/.source/hippy/extend_views/MarqueeRelayManager.java +133 -0
  14. package/rules/.source/hippy/extend_views/MarqueeRelayTextView.java +211 -0
  15. package/rules/.source/hippy/extend_views/ProgressBarView.java +83 -0
  16. package/rules/.source/hippy/extend_views/ProgressBarViewController.java +145 -0
  17. package/rules/.source/hippy/extend_views/SeekBarView.java +104 -0
  18. package/rules/.source/hippy/extend_views/SeekBarViewController.java +218 -0
  19. package/rules/.source/hippy/extend_views/StateImageView.java +149 -0
  20. package/rules/.source/hippy/extend_views/StateImageViewController.java +34 -0
  21. package/rules/.source/hippy/extend_views/TVButtonView.java +314 -0
  22. package/rules/.source/hippy/extend_views/TVButtonViewController.java +89 -0
  23. package/rules/.source/hippy/extend_views/TVTextView.java +684 -0
  24. package/rules/.source/hippy/extend_views/TVViewActor.java +811 -0
  25. package/rules/.source/hippy/extend_views/TVViewActorHost.java +6 -0
  26. package/rules/.source/hippy/extend_views/TVViewActor/346/216/245/345/205/245.md +66 -0
  27. package/rules/.source/hippy/extend_views/TemplateUtil.java +336 -0
  28. package/rules/.source/hippy/extend_views/TextButtonNode.java +47 -0
  29. package/rules/.source/hippy/extend_views/TextViewController.java +377 -0
  30. package/rules/.source/hippy/extend_views/fastlist/CenterFlyInAnimator.java +96 -0
  31. package/rules/.source/hippy/extend_views/fastlist/ChildOnScreenScroller.java +548 -0
  32. package/rules/.source/hippy/extend_views/fastlist/ClonedViewTag.java +17 -0
  33. package/rules/.source/hippy/extend_views/fastlist/EventDeliverer.java +55 -0
  34. package/rules/.source/hippy/extend_views/fastlist/FastAdapter.java +4683 -0
  35. package/rules/.source/hippy/extend_views/fastlist/FastAdapterUtil.java +982 -0
  36. package/rules/.source/hippy/extend_views/fastlist/FastFlexNode.java +48 -0
  37. package/rules/.source/hippy/extend_views/fastlist/FastFlexView.java +873 -0
  38. package/rules/.source/hippy/extend_views/fastlist/FastFlexViewController.java +130 -0
  39. package/rules/.source/hippy/extend_views/fastlist/FastItemNode.java +67 -0
  40. package/rules/.source/hippy/extend_views/fastlist/FastItemView.java +306 -0
  41. package/rules/.source/hippy/extend_views/fastlist/FastItemViewController.java +106 -0
  42. package/rules/.source/hippy/extend_views/fastlist/FastListModule.java +95 -0
  43. package/rules/.source/hippy/extend_views/fastlist/FastListNode.java +90 -0
  44. package/rules/.source/hippy/extend_views/fastlist/FastListView.java +2466 -0
  45. package/rules/.source/hippy/extend_views/fastlist/FastListViewController.java +1038 -0
  46. package/rules/.source/hippy/extend_views/fastlist/FastListView/346/270/262/346/237/223/346/265/201/347/250/213/345/233/276.graffle +0 -0
  47. package/rules/.source/hippy/extend_views/fastlist/FastPendingView.java +47 -0
  48. package/rules/.source/hippy/extend_views/fastlist/ItemDecorations.java +71 -0
  49. package/rules/.source/hippy/extend_views/fastlist/ItemStoreNode.java +64 -0
  50. package/rules/.source/hippy/extend_views/fastlist/ItemStoreView.java +13 -0
  51. package/rules/.source/hippy/extend_views/fastlist/ItemStoreViewController.java +45 -0
  52. package/rules/.source/hippy/extend_views/fastlist/ListItemHolder.java +7 -0
  53. package/rules/.source/hippy/extend_views/fastlist/ListViewControlProp.java +41 -0
  54. package/rules/.source/hippy/extend_views/fastlist/MouseRecycleView.java +509 -0
  55. package/rules/.source/hippy/extend_views/fastlist/OnFastItemClickListener.java +12 -0
  56. package/rules/.source/hippy/extend_views/fastlist/OnFastItemFocusChangeListener.java +9 -0
  57. package/rules/.source/hippy/extend_views/fastlist/OnFastScrollStateChangedListener.java +7 -0
  58. package/rules/.source/hippy/extend_views/fastlist/PendingListNode.java +18 -0
  59. package/rules/.source/hippy/extend_views/fastlist/PendingViewController.java +13 -0
  60. package/rules/.source/hippy/extend_views/fastlist/PostHandlerView.java +6 -0
  61. package/rules/.source/hippy/extend_views/fastlist/PostTaskHolder.java +20 -0
  62. package/rules/.source/hippy/extend_views/fastlist/ReplaceChildController.java +105 -0
  63. package/rules/.source/hippy/extend_views/fastlist/ReplaceChildView.java +312 -0
  64. package/rules/.source/hippy/extend_views/fastlist/TVListView.java +3692 -0
  65. package/rules/.source/hippy/extend_views/fastlist/TemplateCodeParser.java +247 -0
  66. package/rules/.source/hippy/extend_views/fastlist/Utils.java +572 -0
  67. package/rules/.source/hippy/extend_views/fastlist/ViewTag.java +317 -0
  68. package/rules/.source/hippy/extend_views/fastlist/VirtualListView.java +8 -0
  69. package/rules/.source/hippy/extend_views/fastlist/diff/FastListDataBindingHelper.java +320 -0
  70. package/rules/.source/hippy/extend_views/fastlist/diff/KeyDiffHelper.java +289 -0
  71. package/rules/.source/hippy/extend_views/fastlist/diff/NoKeyDiffHelper.java +278 -0
  72. package/rules/.source/hippy/extend_views/tag/FontTag.java +53 -0
  73. package/rules/.source/hippy/extend_views/tag/HtmlTag.java +191 -0
  74. package/rules/.source/hippy/extend_views/tag/HtmlTagHandler.java +185 -0
  75. package/rules/.source/hippy/extend_views/tag/SpanTag.java +160 -0
  76. package/rules/.source/hippy/extend_views/tag/TextFontSpan.java +102 -0
  77. package/rules/.source/hippy/extend_views/waterfall/Chunk.java +10 -0
  78. package/rules/.source/hippy/extend_views/waterfall/ChunkGroup.java +5 -0
  79. package/rules/.source/hippy/extend_views/waterfall/Section.java +4 -0
  80. package/rules/.source/hippy/extend_views/waterfall/Tabs.java +5 -0
  81. package/rules/.source/hippy/extend_views/waterfall/WaterfallUtils.java +26 -0
  82. package/rules/.source/hippy/hippy_uimanager/ControllerHolder.java +30 -0
  83. package/rules/.source/hippy/hippy_uimanager/ControllerManager.java +651 -0
  84. package/rules/.source/hippy/hippy_uimanager/ControllerRegistry.java +102 -0
  85. package/rules/.source/hippy/hippy_uimanager/ControllerUpdateManger.java +252 -0
  86. package/rules/.source/hippy/hippy_uimanager/CustomControllerHelper.java +425 -0
  87. package/rules/.source/hippy/hippy_uimanager/DiffUtils.java +526 -0
  88. package/rules/.source/hippy/hippy_uimanager/ExtendViewGroup.java +36 -0
  89. package/rules/.source/hippy/hippy_uimanager/HippyCustomViewCreator.java +29 -0
  90. package/rules/.source/hippy/hippy_uimanager/HippyGroupController.java +83 -0
  91. package/rules/.source/hippy/hippy_uimanager/HippyViewBase.java +27 -0
  92. package/rules/.source/hippy/hippy_uimanager/HippyViewController.java +2189 -0
  93. package/rules/.source/hippy/hippy_uimanager/HippyViewEvent.java +52 -0
  94. package/rules/.source/hippy/hippy_uimanager/IHippyZIndexViewGroup.java +24 -0
  95. package/rules/.source/hippy/hippy_uimanager/InternalExtendViewUtil.java +395 -0
  96. package/rules/.source/hippy/hippy_uimanager/ListItemRenderNode.java +143 -0
  97. package/rules/.source/hippy/hippy_uimanager/ListViewRenderNode.java +44 -0
  98. package/rules/.source/hippy/hippy_uimanager/MatrixUtil.java +470 -0
  99. package/rules/.source/hippy/hippy_uimanager/NativeGestureDispatcher.java +349 -0
  100. package/rules/.source/hippy/hippy_uimanager/NativeGestureProcessor.java +188 -0
  101. package/rules/.source/hippy/hippy_uimanager/PullFooterRenderNode.java +43 -0
  102. package/rules/.source/hippy/hippy_uimanager/PullHeaderRenderNode.java +43 -0
  103. package/rules/.source/hippy/hippy_uimanager/RenderManager.java +304 -0
  104. package/rules/.source/hippy/hippy_uimanager/RenderNode.java +533 -0
  105. package/rules/.source/hippy/hippy_uimanager/StateView.java +17 -0
  106. package/rules/.source/hippy/hippy_uimanager/TransformUtil.java +125 -0
  107. package/rules/.source/hippy/hippy_uimanager/ViewGroupDrawingOrderHelper.java +108 -0
  108. package/rules/.source/hippy/hippy_uimanager/ViewStateProvider.java +10 -0
  109. package/rules/.source/hippy/hippy_views/audioview/AudioPlayManager.java +457 -0
  110. package/rules/.source/hippy/hippy_views/audioview/AudioView.java +225 -0
  111. package/rules/.source/hippy/hippy_views/audioview/AudioViewController.java +135 -0
  112. package/rules/.source/hippy/hippy_views/common/CommonBackgroundDrawable.java +58 -0
  113. package/rules/.source/hippy/hippy_views/common/CommonBorder.java +37 -0
  114. package/rules/.source/hippy/hippy_views/custom/HippyCustomPropsController.java +61 -0
  115. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerListAdapter.java +399 -0
  116. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerView.java +378 -0
  117. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewController.java +187 -0
  118. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewHolder.java +39 -0
  119. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewWrapper.java +134 -0
  120. package/rules/.source/hippy/hippy_views/hippylist/NodePositionHelper.java +55 -0
  121. package/rules/.source/hippy/hippy_views/hippylist/PreloadHelper.java +54 -0
  122. package/rules/.source/hippy/hippy_views/hippylist/PullFooterEventHelper.java +61 -0
  123. package/rules/.source/hippy/hippy_views/hippylist/PullHeaderEventHelper.java +127 -0
  124. package/rules/.source/hippy/hippy_views/hippylist/RecyclerViewEventHelper.java +394 -0
  125. package/rules/.source/hippy/hippy_views/image/HippyContentDrawable.java +113 -0
  126. package/rules/.source/hippy/hippy_views/image/HippyImageView.java +1608 -0
  127. package/rules/.source/hippy/hippy_views/image/HippyImageViewController.java +382 -0
  128. package/rules/.source/hippy/hippy_views/image/IImageStateListener.java +7 -0
  129. package/rules/.source/hippy/hippy_views/list/ChildOnScreenScroller.java +255 -0
  130. package/rules/.source/hippy/hippy_views/list/HippyListAdapter.java +647 -0
  131. package/rules/.source/hippy/hippy_views/list/HippyListItemView.java +162 -0
  132. package/rules/.source/hippy/hippy_views/list/HippyListItemViewController.java +45 -0
  133. package/rules/.source/hippy/hippy_views/list/HippyListView.java +915 -0
  134. package/rules/.source/hippy/hippy_views/list/HippyListViewController.java +622 -0
  135. package/rules/.source/hippy/hippy_views/list/HippyRecycler.java +31 -0
  136. package/rules/.source/hippy/hippy_views/list/IRecycleItemTypeChange.java +23 -0
  137. package/rules/.source/hippy/hippy_views/list/ItemDecorations.java +70 -0
  138. package/rules/.source/hippy/hippy_views/list/NegativeLongKeyFlinger.java +156 -0
  139. package/rules/.source/hippy/hippy_views/list/NodeHolder.java +34 -0
  140. package/rules/.source/hippy/hippy_views/list/RecycleViewFlinger.java +126 -0
  141. package/rules/.source/hippy/hippy_views/list/TVRecyclerView.java +2070 -0
  142. package/rules/.source/hippy/hippy_views/list/TVSingleLineListView.java +15 -0
  143. package/rules/.source/hippy/hippy_views/modal/HippyModalHostManager.java +102 -0
  144. package/rules/.source/hippy/hippy_views/modal/HippyModalHostView.java +597 -0
  145. package/rules/.source/hippy/hippy_views/modal/ModalHostHelper.java +46 -0
  146. package/rules/.source/hippy/hippy_views/modal/ModalStyleNode.java +34 -0
  147. package/rules/.source/hippy/hippy_views/modal/RequestCloseEvent.java +32 -0
  148. package/rules/.source/hippy/hippy_views/modal/ShowEvent.java +31 -0
  149. package/rules/.source/hippy/hippy_views/navigator/Navigator.java +126 -0
  150. package/rules/.source/hippy/hippy_views/navigator/NavigatorController.java +120 -0
  151. package/rules/.source/hippy/hippy_views/refresh/HippyPullFooterView.java +47 -0
  152. package/rules/.source/hippy/hippy_views/refresh/HippyPullFooterViewController.java +65 -0
  153. package/rules/.source/hippy/hippy_views/refresh/HippyPullHeaderView.java +39 -0
  154. package/rules/.source/hippy/hippy_views/refresh/HippyPullHeaderViewController.java +104 -0
  155. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapper.java +237 -0
  156. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperController.java +62 -0
  157. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperItemController.java +39 -0
  158. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperItemView.java +26 -0
  159. package/rules/.source/hippy/hippy_views/scroll/HippyHorizontalScrollView.java +500 -0
  160. package/rules/.source/hippy/hippy_views/scroll/HippyOnScrollHelper.java +39 -0
  161. package/rules/.source/hippy/hippy_views/scroll/HippyScrollView.java +46 -0
  162. package/rules/.source/hippy/hippy_views/scroll/HippyScrollViewController.java +178 -0
  163. package/rules/.source/hippy/hippy_views/scroll/HippyScrollViewEventHelper.java +92 -0
  164. package/rules/.source/hippy/hippy_views/scroll/HippyVerticalScrollView.java +522 -0
  165. package/rules/.source/hippy/hippy_views/text/HippyTextView.java +512 -0
  166. package/rules/.source/hippy/hippy_views/text/HippyTextViewController.java +77 -0
  167. package/rules/.source/hippy/hippy_views/textinput/HippyTextInput.java +668 -0
  168. package/rules/.source/hippy/hippy_views/textinput/HippyTextInputController.java +528 -0
  169. package/rules/.source/hippy/hippy_views/textinput/TextInputNode.java +115 -0
  170. package/rules/.source/hippy/hippy_views/videoview/APEZProvider.java +287 -0
  171. package/rules/.source/hippy/hippy_views/videoview/APKExpansionSupport.java +82 -0
  172. package/rules/.source/hippy/hippy_views/videoview/PivotPoint.java +13 -0
  173. package/rules/.source/hippy/hippy_views/videoview/ScalableType.java +34 -0
  174. package/rules/.source/hippy/hippy_views/videoview/ScalableVideoView.java +265 -0
  175. package/rules/.source/hippy/hippy_views/videoview/ScaleManager.java +191 -0
  176. package/rules/.source/hippy/hippy_views/videoview/Size.java +19 -0
  177. package/rules/.source/hippy/hippy_views/videoview/VideoHippyView.java +917 -0
  178. package/rules/.source/hippy/hippy_views/videoview/VideoHippyViewController.java +236 -0
  179. package/rules/.source/hippy/hippy_views/videoview/ZipResourceFile.java +427 -0
  180. package/rules/.source/hippy/hippy_views/view/CardRootView.java +28 -0
  181. package/rules/.source/hippy/hippy_views/view/CustomLayoutView.java +10 -0
  182. package/rules/.source/hippy/hippy_views/view/CustomNodeView.java +5 -0
  183. package/rules/.source/hippy/hippy_views/view/DialogViewGroup.java +113 -0
  184. package/rules/.source/hippy/hippy_views/view/HippyViewGroup.java +2042 -0
  185. package/rules/.source/hippy/hippy_views/view/HippyViewGroupController.java +583 -0
  186. package/rules/.source/hippy/hippy_views/view/WindowRoot.java +5 -0
  187. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPager.java +308 -0
  188. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerAdapter.java +148 -0
  189. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerController.java +246 -0
  190. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerItem.java +27 -0
  191. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerItemController.java +42 -0
  192. package/rules/.source/hippy/hippy_views/viewpager/ViewPagerPageChangeListener.java +114 -0
  193. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageItemExposureEvent.java +40 -0
  194. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageScrollEvent.java +43 -0
  195. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageScrollStateChangedEvent.java +42 -0
  196. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageSelectedEvent.java +42 -0
  197. package/rules/.source/hippy/hippy_views/webview/HippyWebView.java +160 -0
  198. package/rules/.source/hippy/hippy_views/webview/HippyWebViewBridge.java +20 -0
  199. package/rules/.source/hippy/hippy_views/webview/HippyWebViewController.java +103 -0
  200. package/rules/.source/hippy/hippy_views/webview/HippyWebViewInner.java +77 -0
  201. package/rules/.windsurfrules +27 -4
  202. package/rules/AGENTS.md +27 -4
  203. package/rules/CLAUDE.md +27 -3
  204. package/rules/GEMINI.md +25 -3
@@ -0,0 +1,211 @@
1
+ package com.tencent.extend.views;
2
+
3
+ import android.animation.Animator;
4
+ import android.animation.AnimatorListenerAdapter;
5
+ import android.animation.ValueAnimator;
6
+ import android.content.Context;
7
+ import android.os.Build;
8
+ import android.text.TextUtils;
9
+ import android.view.animation.LinearInterpolator;
10
+
11
+ import com.tencent.mtt.hippy.common.HippyMap;
12
+ import com.tencent.mtt.hippy.utils.ExtendUtil;
13
+
14
+ /**
15
+ * 跑马灯接力组件
16
+ * 1. 还原原生首轮停顿 1.2s 效果
17
+ * 2. 只有 setSelected(true) 且文本超长时才滚动
18
+ * 3. 滚动结束后自动通知同 Key 组内的下一个组件
19
+ * 4. 4.4以上未获焦中间省略,4.4及以下最后省略
20
+ */
21
+ public class MarqueeRelayTextView extends TVTextView {
22
+
23
+ private ValueAnimator animator;
24
+ private String groupKey;
25
+ private int groupIndex;
26
+ private float scrollSpeed = 100f;
27
+ private static final int NATIVE_START_DELAY = 1200;
28
+
29
+ // 用于取消延时任务
30
+ private final Runnable relayFinishedRunnable = this::notifyRelayFinished;
31
+
32
+ private boolean lastFocused = false;
33
+
34
+ public MarqueeRelayTextView(Context context, HippyMap iniProps, boolean createFromNative) {
35
+ super(context, iniProps,createFromNative);
36
+ init();
37
+ }
38
+
39
+ private void init() {
40
+ setSingleLine();
41
+ setHorizontallyScrolling(true); // 确保水平滚动
42
+
43
+ // 默认截断逻辑
44
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
45
+ setEllipsize(TextUtils.TruncateAt.MIDDLE);
46
+ } else {
47
+ setEllipsize(TextUtils.TruncateAt.END);
48
+ }
49
+
50
+ // setLayerType(LAYER_TYPE_HARDWARE, null); // 保证滚动如丝般顺滑
51
+ }
52
+
53
+ /**
54
+ * 加入接力队列
55
+ * @param key 组名
56
+ * @param index 排序序号
57
+ */
58
+ public void joinRelayGroup(String key, int index) {
59
+ this.groupKey = key;
60
+ this.groupIndex = index;
61
+ MarqueeRelayManager.getInstance().register(key, this);
62
+ }
63
+
64
+ public int getGroupIndex() { return groupIndex; }
65
+
66
+ @Override
67
+ public void setSelected(boolean selected) {
68
+ // 动态切换 Ellipsize
69
+ if (selected) {
70
+ setEllipsize(null); // 滚动时移除截断
71
+ } else {
72
+ // 恢复默认截断
73
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
74
+ setEllipsize(TextUtils.TruncateAt.MIDDLE);
75
+ } else {
76
+ setEllipsize(TextUtils.TruncateAt.END);
77
+ }
78
+ }
79
+
80
+ boolean wasSelected = isSelected();
81
+ super.setSelected(selected);
82
+ if (!wasSelected && selected && groupKey != null) {
83
+ // 激活:请求接力管理(这里仍然保留,为了兼容 JS 手动设置 selected 的场景)
84
+ MarqueeRelayManager.getInstance().requestRelay(groupKey, this);
85
+ } else if (wasSelected && !selected) {
86
+ stopRelay();
87
+ }
88
+ }
89
+
90
+ @Override
91
+ protected void drawableStateChanged() {
92
+ super.drawableStateChanged();
93
+ if (groupKey == null) return;
94
+
95
+ if(isFocusable() || isDuplicateParentStateEnabled() ) {
96
+ int[] states = getDrawableState();
97
+ boolean focused = ExtendUtil.stateContainsAttribute(states, android.R.attr.state_focused);
98
+ // 防止重复调用
99
+ if (focused != lastFocused) {
100
+ lastFocused = focused;
101
+ if (focused) {
102
+ MarqueeRelayManager.getInstance().onFocusGain(groupKey, this);
103
+ postInvalidate();
104
+ } else {
105
+ MarqueeRelayManager.getInstance().onFocusLost(groupKey);
106
+ postInvalidate();
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ // 由管理器调用的内部启动方法
113
+ protected void startRelayAnimation() {
114
+ post(() -> {
115
+ // 如果任务运行期间 View 已经被取消选中(Reset 了),则直接退出
116
+ // 注意:这里需要同时检查 isSelected 和 isFocused 吗?
117
+ // 为了兼容两种模式,只要有一个为 true 就继续?
118
+ // 不,我们的设计是:selected 状态由 JS 控制,focus 状态由原生控制。
119
+ // 如果原生获焦,通常不会自动 setSelected(true)(除非上层做了联动)。
120
+ // 但跑马灯需要在获焦时滚动。
121
+ // 所以我们应该放宽检查条件:只要是 selected OR focused 就可以。
122
+ // 或者,我们在 onFocusGain 里自动 setSelected(true)?这可能会干扰 JS 状态。
123
+ // 让我们假设获焦时不需要 setEllipsize(null) 也能滚?不,必须 null。
124
+
125
+ // 这是一个潜在冲突点:drawableStateChanged 触发了 startCycle,但 setEllipsize(null) 是在 setSelected 里做的。
126
+ // 如果只获焦不 Selected,Ellipsize 还是 MIDDLE,滚动可能无效。
127
+
128
+ // 解决方案:在 startRelayAnimation 开始前,临时去掉 Ellipsize。
129
+ // 并在 stopRelay 时恢复。
130
+
131
+ boolean isActive = isSelected() || lastFocused; // lastFocused 即当前 focus 状态
132
+ if (!isActive) {
133
+ return;
134
+ }
135
+
136
+ // 确保 Ellipsize 为 null
137
+ if (getEllipsize() != null) {
138
+ setEllipsize(null);
139
+ }
140
+
141
+ float textWidth = getPaint().measureText(getText().toString());
142
+ float viewWidth = getWidth();
143
+
144
+ // 如果文字没超长,稍微停顿一下然后接力下一个
145
+ if (textWidth <= viewWidth) {
146
+ setTranslationX(0);
147
+ postDelayed(relayFinishedRunnable, 500);
148
+ return;
149
+ }
150
+
151
+ // 自动降级处理
152
+ // if (textWidth > 2048) {
153
+ // setLayerType(LAYER_TYPE_SOFTWARE, null);
154
+ // } else {
155
+ // setLayerType(LAYER_TYPE_HARDWARE, null);
156
+ // }
157
+
158
+ // 还原原生轨迹
159
+ if (animator != null) animator.cancel();
160
+
161
+ int targetScrollX = (int)(textWidth - viewWidth);
162
+ animator = ValueAnimator.ofInt(0, targetScrollX);
163
+ animator.setDuration((long) (targetScrollX / scrollSpeed * 1000));
164
+ animator.setInterpolator(new LinearInterpolator());
165
+ animator.setStartDelay(NATIVE_START_DELAY);
166
+
167
+ animator.addUpdateListener(animation -> {
168
+ scrollTo((int) animation.getAnimatedValue(), 0);
169
+ postInvalidate();
170
+ });
171
+ animator.addListener(new AnimatorListenerAdapter() {
172
+ @Override
173
+ public void onAnimationEnd(Animator animation) {
174
+ scrollTo(0, 0); // 复位
175
+ postInvalidate();
176
+ notifyRelayFinished();
177
+ }
178
+ });
179
+ animator.start();
180
+ });
181
+ }
182
+
183
+ private void notifyRelayFinished() {
184
+ if (groupKey != null) {
185
+ MarqueeRelayManager.getInstance().dispatchNext(groupKey, groupIndex);
186
+ }
187
+ }
188
+
189
+ public void stopRelay() {
190
+ if (animator != null) animator.cancel();
191
+ removeCallbacks(relayFinishedRunnable);
192
+ scrollTo(0, 0);
193
+ postInvalidate();
194
+ // 恢复 Ellipsize (如果既没选中也没焦点)
195
+ if (!isSelected() && !lastFocused) {
196
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
197
+ setEllipsize(TextUtils.TruncateAt.MIDDLE);
198
+ } else {
199
+ setEllipsize(TextUtils.TruncateAt.END);
200
+ }
201
+ }
202
+ }
203
+
204
+ @Override
205
+ protected void onDetachedFromWindow() {
206
+ stopRelay();
207
+ postInvalidate();
208
+ MarqueeRelayManager.getInstance().unregister(groupKey, this);
209
+ super.onDetachedFromWindow();
210
+ }
211
+ }
@@ -0,0 +1,83 @@
1
+ package com.tencent.extend.views;
2
+
3
+ import android.content.Context;
4
+ import android.view.MotionEvent;
5
+ import android.view.View;
6
+
7
+ import com.tencent.mtt.hippy.uimanager.HippyViewBase;
8
+ import com.tencent.mtt.hippy.uimanager.NativeGestureDispatcher;
9
+ import com.tencent.mtt.hippy.uimanager.StateView;
10
+ import com.tencent.mtt.hippy.utils.ExtendUtil;
11
+ import com.tencent.mtt.supportui.utils.struct.ArrayMap;
12
+
13
+ class ProgressBarView extends android.widget.ProgressBar implements HippyViewBase, StateView {
14
+
15
+ private NativeGestureDispatcher mGestureDispatcher;
16
+
17
+ public ProgressBarView(Context context,int style) {
18
+ super(context,null,style);
19
+ }
20
+
21
+ @Override
22
+ public boolean onTouchEvent(MotionEvent event)
23
+ {
24
+ boolean result = super.onTouchEvent(event);
25
+ if (mGestureDispatcher != null)
26
+ {
27
+ result |= mGestureDispatcher.handleTouchEvent(event);
28
+ }
29
+ return result;
30
+ }
31
+
32
+ @Override
33
+ public NativeGestureDispatcher getGestureDispatcher()
34
+ {
35
+ return mGestureDispatcher;
36
+ }
37
+
38
+ @Override
39
+ public void setGestureDispatcher(NativeGestureDispatcher dispatcher)
40
+ {
41
+ mGestureDispatcher = dispatcher;
42
+ }
43
+
44
+
45
+ private int[] showOnState;
46
+
47
+ @Override
48
+ public void setShowOnState(int[] showOnState) {
49
+ this.showOnState = showOnState;
50
+ }
51
+
52
+ /** custom showOnState
53
+ * --------------------
54
+ */
55
+ private String[] showOnStateCustom;
56
+ ArrayMap<String,Boolean> mCustomStateList = null;
57
+ @Override
58
+ public void setCustomState(String state, boolean on) {
59
+ if (mCustomStateList == null) {
60
+ mCustomStateList = new ArrayMap<>();
61
+ }
62
+ mCustomStateList.put(state,on);
63
+ refreshDrawableState();
64
+ }
65
+
66
+ @Override
67
+ public void setShowOnCustomState(String[] showOnState) {
68
+ this.showOnStateCustom = showOnState;
69
+ }
70
+
71
+ /**custom showOnState
72
+ * ----------------
73
+ */
74
+
75
+ @Override
76
+ protected void drawableStateChanged() {
77
+ super.drawableStateChanged();
78
+ int[] states = getDrawableState();
79
+
80
+ ExtendUtil.handleShowOnState(this,states,showOnState);
81
+ ExtendUtil.handleCustomShowOnState(this, mCustomStateList,showOnStateCustom);
82
+ }
83
+ }
@@ -0,0 +1,145 @@
1
+ package com.tencent.extend.views;
2
+
3
+ import android.content.Context;
4
+ import android.graphics.Color;
5
+ import android.graphics.drawable.ClipDrawable;
6
+ import android.graphics.drawable.Drawable;
7
+ import android.graphics.drawable.GradientDrawable;
8
+ import android.graphics.drawable.LayerDrawable;
9
+ import android.os.Build;
10
+ import android.util.Log;
11
+ import android.view.View;
12
+ import android.widget.ProgressBar;
13
+
14
+ import com.tencent.mtt.hippy.R;
15
+ import com.tencent.mtt.hippy.annotation.HippyController;
16
+ import com.tencent.mtt.hippy.annotation.HippyControllerProps;
17
+ import com.tencent.mtt.hippy.common.HippyArray;
18
+ import com.tencent.mtt.hippy.common.HippyMap;
19
+ import com.tencent.mtt.hippy.dom.node.NodeProps;
20
+ import com.tencent.mtt.hippy.uimanager.HippyViewController;
21
+
22
+ import java.lang.reflect.Field;
23
+
24
+ @HippyController(name = "ProgressBar")
25
+ public class ProgressBarViewController extends HippyViewController {
26
+ @Override
27
+ protected View createViewImpl(Context context) {
28
+ return null;
29
+ }
30
+
31
+ @Override
32
+ protected View createViewImpl(Context context, HippyMap iniProps) {
33
+
34
+ final ProgressBarView progressBar = new ProgressBarView(context, android.R.attr.progressBarStyleHorizontal);
35
+
36
+ final LayerDrawable drawable = (LayerDrawable) context.getResources().getDrawable(R.drawable.player_seekbar);
37
+ fixDrawable(drawable,iniProps);
38
+
39
+ progressBar.setProgressDrawable(drawable);
40
+
41
+
42
+ return progressBar;
43
+ }
44
+
45
+ private GradientDrawable getDrawableFromClipDrawable(ClipDrawable clipDrawable){
46
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
47
+ return (GradientDrawable) clipDrawable.getDrawable();
48
+ }else{
49
+ try {
50
+ Field field = clipDrawable.getClass().getSuperclass().getDeclaredField("mDrawable");
51
+ field.setAccessible(true);
52
+ Object o = new Object();
53
+ Log.d("hippy","o is :"+o);
54
+ Object r = field.get(o);
55
+ Log.d("hippy","r is :"+r);
56
+ return null;
57
+ }catch (Throwable t){
58
+ //t.printStackTrace();
59
+ Log.e("hippy","ProgressBarViewController getDrawableFromClipDrawable fail ANDROID_VERSION:"+Build.VERSION.SDK_INT);
60
+ return null;
61
+ }
62
+ }
63
+ }
64
+
65
+
66
+
67
+ private void fixDrawable(LayerDrawable drawable, HippyMap map){
68
+ /*
69
+ * backGroundColor:
70
+ * startColor:
71
+ * endColor:
72
+ * cornerRadius:
73
+ * secondStartColor:
74
+ * secondEndColor:
75
+ */
76
+
77
+ if(map.containsKey("backGroundColor")){
78
+ //bg
79
+ GradientDrawable bg = (GradientDrawable) drawable.getDrawable(0);
80
+ int bgColor = Color.parseColor(map.getString("backGroundColor"));
81
+ bg.setColor(bgColor);
82
+ }
83
+
84
+ if(map.containsKey("cornerRadius")){
85
+ for(int i = 0; i < drawable.getNumberOfLayers(); i++){
86
+ final Drawable d = drawable.getDrawable(i);
87
+ if(d instanceof GradientDrawable) {
88
+ ((GradientDrawable) d).setCornerRadius(map.getInt("cornerRadius"));
89
+ }else if(d instanceof ClipDrawable){
90
+ GradientDrawable gd = getDrawableFromClipDrawable((ClipDrawable) d);
91
+ if(gd != null){
92
+ gd.setCornerRadius(map.getInt("cornerRadius"));
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ if(map.containsKey("secondColor")){
99
+ ClipDrawable clipDrawable = (ClipDrawable) drawable.getDrawable(1);
100
+ int color = Color.parseColor(map.getString("secondColor"));
101
+ GradientDrawable gd = getDrawableFromClipDrawable(clipDrawable);
102
+ if(gd != null) {
103
+ gd.setColor(color);
104
+ }
105
+ }
106
+
107
+ if(map.containsKey("startColor")){
108
+ ClipDrawable clipDrawable = (ClipDrawable) drawable.getDrawable(2);
109
+ GradientDrawable gd = getDrawableFromClipDrawable(clipDrawable);
110
+ if(gd != null) {
111
+ int startColor = Color.parseColor(map.getString("startColor"));
112
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && map.containsKey("endColor")) {
113
+ int endColor = Color.parseColor(map.getString("endColor"));
114
+ int[] colors = new int[]{startColor, endColor};
115
+ gd.mutate();
116
+ gd.setColors(colors);
117
+ } else {
118
+ gd.setColor(startColor);
119
+ }
120
+ }
121
+ }
122
+
123
+ }
124
+
125
+ @HippyControllerProps(name = NodeProps.PROGRESS, defaultType = HippyControllerProps.NUMBER)
126
+ public void setProgress(ProgressBar pb,int progress){
127
+ pb.setProgress(progress);
128
+ }
129
+
130
+ @HippyControllerProps(name = NodeProps.SECOND_PROGRESS, defaultType = HippyControllerProps.NUMBER)
131
+ public void setSecondProgress(ProgressBar pb,int progress){
132
+ pb.setSecondaryProgress(progress);
133
+ }
134
+
135
+ @HippyControllerProps(name = NodeProps.PROGRESS_MAX, defaultType = HippyControllerProps.NUMBER)
136
+ public void setMaxProgress(ProgressBar pb,int max){
137
+ pb.setMax(max);
138
+ }
139
+
140
+
141
+
142
+
143
+
144
+
145
+ }
@@ -0,0 +1,104 @@
1
+ package com.tencent.extend.views;
2
+
3
+ import android.content.Context;
4
+ import android.view.KeyEvent;
5
+ import android.view.MotionEvent;
6
+ import android.view.View;
7
+ import android.widget.SeekBar;
8
+
9
+ import com.tencent.mtt.hippy.uimanager.HippyViewBase;
10
+ import com.tencent.mtt.hippy.uimanager.NativeGestureDispatcher;
11
+ import com.tencent.mtt.hippy.uimanager.StateView;
12
+ import com.tencent.mtt.hippy.utils.ExtendUtil;
13
+ import com.tencent.mtt.supportui.utils.struct.ArrayMap;
14
+
15
+ public class SeekBarView extends SeekBar implements HippyViewBase, StateView {
16
+
17
+ public SeekBarView(Context context) {
18
+ super(context);
19
+ }
20
+ boolean listenProgressEvent = true;
21
+ boolean interceptKeyEvent = false;
22
+
23
+ private NativeGestureDispatcher mGestureDispatcher;
24
+
25
+ @Override
26
+ public boolean onTouchEvent(MotionEvent event)
27
+ {
28
+ boolean result = super.onTouchEvent(event);
29
+ if (mGestureDispatcher != null)
30
+ {
31
+ result |= mGestureDispatcher.handleTouchEvent(event);
32
+ }
33
+ return result;
34
+ }
35
+
36
+ public void setInterceptKeyEvent(boolean interceptKeyEvent) {
37
+ this.interceptKeyEvent = interceptKeyEvent;
38
+ }
39
+
40
+ @Override
41
+ public boolean dispatchKeyEvent(KeyEvent event) {
42
+ return (interceptKeyEvent && (event.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT ) || event.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT)
43
+ || super.dispatchKeyEvent(event);
44
+ }
45
+
46
+ @Override
47
+ public NativeGestureDispatcher getGestureDispatcher()
48
+ {
49
+ return mGestureDispatcher;
50
+ }
51
+
52
+ @Override
53
+ public void setGestureDispatcher(NativeGestureDispatcher dispatcher)
54
+ {
55
+ mGestureDispatcher = dispatcher;
56
+ }
57
+
58
+ public void setListenProgressEvent(boolean listen){
59
+ this.listenProgressEvent =listen;
60
+ }
61
+
62
+ public boolean isListenProgressEvent() {
63
+ return listenProgressEvent;
64
+ }
65
+
66
+
67
+ private int[] showOnState;
68
+
69
+ @Override
70
+ public void setShowOnState(int[] showOnState) {
71
+ this.showOnState = showOnState;
72
+ }
73
+
74
+ /** custom showOnState
75
+ * --------------------
76
+ */
77
+ private String[] showOnStateCustom;
78
+ ArrayMap<String,Boolean> mCustomStateList = null;
79
+ @Override
80
+ public void setCustomState(String state, boolean on) {
81
+ if (mCustomStateList == null) {
82
+ mCustomStateList = new ArrayMap<>();
83
+ }
84
+ mCustomStateList.put(state,on);
85
+ refreshDrawableState();
86
+ }
87
+
88
+ @Override
89
+ public void setShowOnCustomState(String[] showOnState) {
90
+ this.showOnStateCustom = showOnState;
91
+ }
92
+
93
+ /**custom showOnState
94
+ * ----------------
95
+ */
96
+
97
+ @Override
98
+ protected void drawableStateChanged() {
99
+ super.drawableStateChanged();
100
+ int[] states = getDrawableState();
101
+ ExtendUtil.handleShowOnState(this,states,showOnState);
102
+ ExtendUtil.handleCustomShowOnState(this, mCustomStateList,showOnStateCustom);
103
+ }
104
+ }