当前位置:   article > 正文

鸿蒙OS下拉刷新及上拉加载harmonyos-refreshlayout_鸿蒙 list 下拉加载

鸿蒙 list 下拉加载

鸿蒙os2发布后,为了跟上节奏,对鸿蒙java-sdk进行了初步的学习。并尝试用鸿蒙os-sdk进行公司app的开发,但是发现鸿蒙组件库及开源组件库还是在初步开发阶段。很多组件可能需要自己进行开发。

附上鸿蒙开源库地址:https://gitee.com/openharmony-tpc

在这里找到了一些下拉刷新的组件,但是经过测试都有一些bug,或者是不满足自己的需求。于是参考了一下他们的代码进行了修改。

最后附上gitee地址

上代码:

  1. package com.honglu.refreshlayout;
  2. import ohos.agp.animation.Animator;
  3. import ohos.agp.animation.AnimatorValue;
  4. import ohos.agp.colors.RgbColor;
  5. import ohos.agp.components.*;
  6. import ohos.agp.components.element.Element;
  7. import ohos.agp.components.element.ShapeElement;
  8. import ohos.agp.utils.Color;
  9. import ohos.agp.utils.Point;
  10. import ohos.app.Context;
  11. import static ohos.agp.components.ComponentContainer.LayoutConfig.MATCH_PARENT;
  12. import static ohos.agp.utils.LayoutAlignment.BOTTOM;
  13. import static ohos.agp.utils.LayoutAlignment.TOP;
  14. /**
  15. * create by ly
  16. */
  17. public class RefreshLayout extends StackLayout implements Component.DraggedListener {
  18. private Context mContext;
  19. private float mPullHeight;
  20. private float mHeaderHeight;
  21. private Component mContentView;
  22. private Component footer;
  23. private Component header;
  24. private static final String EnableLoadMore = "EnableLoadMore";
  25. private static final String EnableRefresh = "EnableRefresh";
  26. private static final String RefreshBg = "RefreshBg";
  27. private static final String RotateIconId = "RotateIconId";
  28. private boolean enableLoadMore = false;
  29. private boolean enableRefresh = false;
  30. private int refreshBgColor;
  31. private Element rotateIcon = null;
  32. private int startY;
  33. private Image refreshImage;
  34. private Image loadImage;
  35. public RefreshLayout(Context context) {
  36. this(context, null, null);
  37. }
  38. public RefreshLayout(Context context, AttrSet attrs) {
  39. this(context, attrs, null);
  40. }
  41. public RefreshLayout(Context context, AttrSet attrs, String defStyleAttr) {
  42. super(context, attrs, defStyleAttr);
  43. mContext = context;
  44. init(context, attrs);
  45. }
  46. private void init(Context context, AttrSet attrs) {
  47. mContext = context;
  48. if (getChildCount() > 1) {
  49. throw new RuntimeException("you can only attach one child");
  50. }
  51. setAttrs(attrs);
  52. mPullHeight = 220;
  53. mHeaderHeight = 160;
  54. setLayoutRefreshedListener(component -> {
  55. if (header == null) {
  56. addHeaderView();
  57. addFooter();
  58. mContentView = getComponentAt(0);
  59. }
  60. });
  61. setDraggedListener(DRAG_VERTICAL, this);
  62. }
  63. private void setAttrs(AttrSet attrs) {
  64. boolean enableLoadMore = attrs.getAttr(EnableLoadMore).isPresent();
  65. if (enableLoadMore) {
  66. this.enableLoadMore = attrs.getAttr(EnableLoadMore).get().getBoolValue();
  67. }
  68. boolean enableRefresh = attrs.getAttr(EnableRefresh).isPresent();
  69. if (enableRefresh) {
  70. this.enableRefresh = attrs.getAttr(EnableRefresh).get().getBoolValue();
  71. }
  72. boolean refreshBg = attrs.getAttr(RefreshBg).isPresent();
  73. if (refreshBg) {
  74. this.refreshBgColor = attrs.getAttr(RefreshBg).get().getColorValue().getValue();
  75. }else{
  76. this.refreshBgColor = Color.getIntColor("#22000000");
  77. }
  78. boolean rotateIconId = attrs.getAttr(RotateIconId).isPresent();
  79. if (rotateIconId) {
  80. rotateIcon = attrs.getAttr(RotateIconId).get().getElement();
  81. }
  82. }
  83. private boolean isRefresh = false;
  84. private boolean isLoad = false;
  85. private void onDrugUpdate(DragInfo dragInfo) {
  86. int upY = Math.round(dragInfo.updatePoint.position[1]);
  87. float dy = upY - startY;
  88. if (Math.abs(dy) > 20) {
  89. if (!Constant.IS_REFRESH_ING) {
  90. if (dy > 0 && enableRefresh) {
  91. isRefresh = true;
  92. isLoad = false;
  93. dy = Math.min(mPullHeight * 2, dy);
  94. dy = Math.max(0, dy);
  95. translateHeader(dy);
  96. } else if (dy < 0 && enableLoadMore) {
  97. dy = Math.abs(dy);
  98. dy = Math.min(mPullHeight * 2, dy);
  99. dy = Math.max(0, dy);
  100. isRefresh = false;
  101. isLoad = true;
  102. translateFooter(dy);
  103. }
  104. }
  105. }
  106. }
  107. private void onDrugEnd(DragInfo dragInfo) {
  108. Point mPoint = dragInfo.updatePoint;
  109. int endY = Math.round(mPoint.position[1]);
  110. int dy = Math.abs(endY - startY);
  111. if (dy > mPullHeight * 2) {
  112. if (onCircleRefreshListener != null) {
  113. if (isRefresh && enableRefresh) {
  114. startRefresh();
  115. onCircleRefreshListener.refreshing();
  116. } else if (isLoad && enableLoadMore) {
  117. startLoad();
  118. onCircleRefreshListener.loading();
  119. }
  120. }
  121. } else {
  122. if(endY > startY) {
  123. refreshComplete();
  124. }else {
  125. loadComplete();
  126. }
  127. }
  128. }
  129. private void startRefresh() {
  130. LayoutConfig layoutConfig =
  131. (LayoutConfig) header.getLayoutConfig();
  132. layoutConfig.height = (int) mHeaderHeight;
  133. header.setLayoutConfig(layoutConfig);
  134. header.invalidate();
  135. mContentView.setTranslationY(mHeaderHeight);
  136. refreshAnim.start();
  137. Constant.IS_REFRESH_ING = true;
  138. Constant.IS_FINISH_REFRESH = false;
  139. }
  140. private void startLoad() {
  141. LayoutConfig layoutConfig =
  142. (LayoutConfig) footer.getLayoutConfig();
  143. layoutConfig.height = (int) mHeaderHeight;
  144. footer.setLayoutConfig(layoutConfig);
  145. footer.invalidate();
  146. mContentView.setTranslationY(-mHeaderHeight);
  147. loadAnim.start();
  148. Constant.IS_REFRESH_ING = true;
  149. Constant.IS_FINISH_REFRESH = false;
  150. }
  151. public void refreshComplete() {
  152. LogUtil.error("-----refreshComplete-----");
  153. Constant.IS_REFRESH_ING = false;
  154. Constant.IS_FINISH_REFRESH = true;
  155. refreshAnim.stop();
  156. isRefresh = false;
  157. isLoad = false;
  158. refreshClose.start();
  159. }
  160. public void loadComplete() {
  161. LogUtil.error("-----loadComplete-----");
  162. Constant.IS_REFRESH_ING = false;
  163. Constant.IS_FINISH_REFRESH = true;
  164. loadAnim.stop();
  165. isRefresh = false;
  166. isLoad = false;
  167. loadClose.start();
  168. }
  169. private void addHeaderView() {
  170. LogUtil.error("--------addHeaderView-----------");
  171. header = LayoutScatter.getInstance(mContext)
  172. .parse(ResourceTable.Layout_refresh, null, false);
  173. if(refreshBgColor!=0) {
  174. ShapeElement element = new ShapeElement();
  175. element.setRgbColor(RgbColor.fromArgbInt(refreshBgColor));
  176. header.setBackground(element);
  177. }
  178. refreshImage = (Image) header.findComponentById(ResourceTable.Id_refresh);
  179. if(rotateIcon != null) {
  180. refreshImage.setImageElement(rotateIcon);
  181. }else{
  182. refreshImage.setImageAndDecodeBounds(ResourceTable.Media_refresh);
  183. }
  184. LayoutConfig config = new LayoutConfig();
  185. config.width = MATCH_PARENT;
  186. config.height = 0;
  187. config.alignment = TOP;
  188. super.addComponent(header, 1, config);
  189. initHeadAmin();
  190. }
  191. private void addFooter() {
  192. LogUtil.error("--------addBottom-----------");
  193. footer = LayoutScatter.getInstance(mContext)
  194. .parse(ResourceTable.Layout_load_more, null, false);
  195. if(refreshBgColor!=0) {
  196. ShapeElement element = new ShapeElement();
  197. element.setRgbColor(RgbColor.fromArgbInt(refreshBgColor));
  198. footer.setBackground(element);
  199. }
  200. loadImage = (Image) footer.findComponentById(ResourceTable.Id_load);
  201. if(rotateIcon != null) {
  202. loadImage.setImageElement(rotateIcon);
  203. }else{
  204. loadImage.setImageAndDecodeBounds(ResourceTable.Media_refresh);
  205. }
  206. LayoutConfig config = new LayoutConfig();
  207. config.alignment = BOTTOM;
  208. config.width = MATCH_PARENT;
  209. config.height = 0;
  210. super.addComponent(footer, 2, config);
  211. initLoadAmin();
  212. }
  213. private AnimatorValue refreshAnim;
  214. private AnimatorValue loadAnim;
  215. private AnimatorValue refreshClose;
  216. private AnimatorValue loadClose;
  217. private void initHeadAmin() {
  218. refreshAnim = new AnimatorValue();
  219. refreshAnim.setDuration(1000);
  220. refreshAnim.setLoopedCount(Animator.INFINITE);
  221. refreshAnim.setCurveType(Animator.CurveType.LINEAR);
  222. refreshAnim.setValueUpdateListener((animatorValue, v) -> {
  223. refreshImage.setRotation(v * 360);
  224. });
  225. refreshClose = new AnimatorValue();
  226. refreshClose.setDuration(500);
  227. refreshClose.setLoopedCount(0);
  228. refreshClose.setCurveType(Animator.CurveType.LINEAR);
  229. refreshClose.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() {
  230. @Override
  231. public void onUpdate(AnimatorValue animatorValue, float v) {
  232. // refreshImage.setRotation(v * 360);
  233. LayoutConfig layoutConfig =
  234. (LayoutConfig) header.getLayoutConfig();
  235. int height = layoutConfig.height;
  236. float rate = 1.0f - v;
  237. if (rate < 0.1) {
  238. rate = 0;
  239. refreshClose.stop();
  240. }
  241. int rateHeight = (int) (height * rate);
  242. layoutConfig.height = rateHeight;
  243. header.setLayoutConfig(layoutConfig);
  244. header.invalidate();
  245. mContentView.setTranslationY(rateHeight);
  246. }
  247. });
  248. }
  249. private void initLoadAmin() {
  250. loadAnim = new AnimatorValue();
  251. loadAnim.setDuration(1000);
  252. loadAnim.setLoopedCount(Animator.INFINITE);
  253. loadAnim.setCurveType(Animator.CurveType.LINEAR);
  254. loadAnim.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() {
  255. @Override
  256. public void onUpdate(AnimatorValue animatorValue, float v) {
  257. loadImage.setRotation(v * 360);
  258. }
  259. });
  260. loadClose = new AnimatorValue();
  261. loadClose.setDuration(500);
  262. loadClose.setLoopedCount(0);
  263. loadClose.setCurveType(Animator.CurveType.LINEAR);
  264. loadClose.setValueUpdateListener((animatorValue, v) -> {
  265. // refreshImage.setRotation(v * 360);
  266. LayoutConfig layoutConfig =
  267. (LayoutConfig) footer.getLayoutConfig();
  268. int height = layoutConfig.height;
  269. float rate = 1.0f - v;
  270. if (rate < 0.1) {
  271. rate = 0;
  272. loadClose.stop();
  273. }
  274. int rateHeight = (int) (height * rate);
  275. layoutConfig.height = rateHeight;
  276. footer.setLayoutConfig(layoutConfig);
  277. footer.invalidate();
  278. mContentView.setTranslationY(-rateHeight);
  279. });
  280. }
  281. private void translateHeader(float dy) {
  282. float offsetY = (dy / 2 / mPullHeight) * dy / 2;
  283. float rate = offsetY / mPullHeight;
  284. refreshImage.setRotation(rate * 360);
  285. LayoutConfig layoutConfig =
  286. (LayoutConfig) header.getLayoutConfig();
  287. layoutConfig.height = (int) offsetY;
  288. // LogUtil.error("-------translateHeader------------> " + offsetY);
  289. // header.setHeight((int) offsetY);
  290. header.setLayoutConfig(layoutConfig);
  291. header.invalidate();
  292. mContentView.setTranslationY(offsetY);
  293. }
  294. private void translateFooter(float dy) {
  295. // setTranslationY((dy / 2 / mPullHeight) * dy / 2);
  296. float offsetY = (dy / 2 / mPullHeight) * dy / 2;
  297. float rate = offsetY / mPullHeight;
  298. loadImage.setRotation(rate * 360);
  299. // LogUtil.error("-------translateFooter--------> " + offsetY);
  300. LayoutConfig layoutConfig =
  301. (LayoutConfig) footer.getLayoutConfig();
  302. layoutConfig.height = (int) offsetY;
  303. // header.setHeight((int) offsetY);
  304. footer.setLayoutConfig(layoutConfig);
  305. footer.invalidate();
  306. mContentView.setTranslationY(-offsetY);
  307. }
  308. private OnRefreshListener onCircleRefreshListener;
  309. public void setOnRefreshListener(OnRefreshListener onCircleRefreshListener) {
  310. this.onCircleRefreshListener = onCircleRefreshListener;
  311. }
  312. @Override
  313. public void onDragDown(Component component, DragInfo dragInfo) {
  314. LogUtil.error("-----onDragDown-----");
  315. startY = Math.round(dragInfo.downPoint.position[1]);
  316. }
  317. @Override
  318. public void onDragStart(Component component, DragInfo dragInfo) {
  319. LogUtil.error("-----onDragStart-----");
  320. }
  321. @Override
  322. public void onDragUpdate(Component component, DragInfo dragInfo) {
  323. onDrugUpdate(dragInfo);
  324. }
  325. @Override
  326. public void onDragEnd(Component component, DragInfo dragInfo) {
  327. onDrugEnd(dragInfo);
  328. }
  329. @Override
  330. public void onDragCancel(Component component, DragInfo dragInfo) {
  331. LogUtil.error("-----onDragCancel-----");
  332. }
  333. public interface OnRefreshListener {
  334. void loading();
  335. void refreshing();
  336. }
  337. public void setRefreshEnabled(boolean enabled){
  338. this.enableRefresh = enabled;
  339. }
  340. public void setLoadMoreEnabled(boolean enabled){
  341. this.enableLoadMore = enabled;
  342. }
  343. }

Constant:

  1. package com.honglu.refreshlayout;
  2. public class Constant {
  3. /**
  4. * 是否正在刷新中
  5. */
  6. public static boolean IS_REFRESH_ING;
  7. /**
  8. * 是否结束刷新
  9. */
  10. public static boolean IS_FINISH_REFRESH;
  11. }

gitee地址:https://gitee.com/lylave/harmonyos-refreshlayout

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/228870
推荐阅读
相关标签
  

闽ICP备14008679号