PullDownRefresh.ets 6.01 KB
import { RefreshConstants as Const, RefreshState } from './RefreshConstants';
import { touchMoveLoadMore, touchUpLoadMore } from './PullUpLoadMore';
import PageModel from '../viewmodel/PageModel';
import PageHelper from '../viewmodel/PageHelper';
import PageAdModel from '../viewmodel/PageAdvModel';
import { LoadStatus } from '../components/refresh/RefreshLayoutBean';
//下拉刷新上拉加载更多组件
export function listTouchEvent(pageModel: PageModel, pageAdvModel: PageAdModel, event: TouchEvent) {
  switch (event.type) {
    case TouchType.Down:
      pageModel.downY = event.touches[0].y;
      pageModel.lastMoveY = event.touches[0].y;
      break;
    case TouchType.Move:
      if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
        return;
      }
      let isDownPull = event.touches[0].y - pageModel.lastMoveY > 0;
      if (((isDownPull === true) || (pageModel.isPullRefreshOperation === true)) && (pageModel.isCanLoadMore === false)) {
        // Finger movement, processing pull-down refresh.
        touchMovePullRefresh(pageModel, event);
      } else {
        // Finger movement, processing load more.
        touchMoveLoadMore(pageModel, event);
      }
      pageModel.lastMoveY = event.touches[0].y;
      break;
    case TouchType.Cancel:
      break;
    case TouchType.Up:
      if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
        return;
      }
      if ((pageModel.isPullRefreshOperation === true)) {
        // Lift your finger and pull down to refresh.
        touchUpPullRefresh(pageModel, pageAdvModel);
      } else {
        // Fingers up, handle loading more.
        // touchUpLoadMore(pageModel);
      }
      break;
    default:
      break;
  }
}

export function touchMovePullRefresh(pageModel: PageModel, event: TouchEvent) {
  if (pageModel.startIndex === 0) {
    pageModel.isPullRefreshOperation = true;
    let height = vp2px(Const.CUSTOM_REFRESH_DECIDE_HEIGHT);
    pageModel.offsetY = event.touches[0].y - pageModel.downY;
    // The sliding offset is greater than the pull-down refresh layout height, and the refresh condition is met.
    if (pageModel.offsetY >= height) {
      pullRefreshState(pageModel, RefreshState.Release);
      pageModel.offsetY = height + pageModel.offsetY * Const.Y_OFF_SET_COEFFICIENT;
    } else {
      pullRefreshState(pageModel, RefreshState.DropDown);
    }
    if (pageModel.offsetY < 0) {
      pageModel.offsetY = 0;
      pageModel.isPullRefreshOperation = false;
    }
  }
}

export function touchUpPullRefresh(pageModel: PageModel, pageAdvModel: PageAdModel) {
  if (pageModel.isCanRefresh === true) {
    pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
    pullRefreshState(pageModel, RefreshState.Refreshing);
    pageModel.currentPage = 1;
    setTimeout(() => {
      let self: PageModel = pageModel;
      let advSelf: PageAdModel = pageAdvModel;
      PageHelper.refreshUI(self, advSelf)
    }, Const.DELAY_TIME);
  } else {
    closeRefresh(pageModel, false);
  }
}

/**
 * 自动刷新接口,如首页底导,双击按钮自动刷新
 * @param pageModel 页面数据
 * @param pageAdvModel 广告数据
 */
export function autoRefresh(pageModel: PageModel, pageAdvModel: PageAdModel) {
  if (pageModel.isRefreshing === true) {
    // 拦截多次刷新
    return
  }
  pageModel.isVisiblePullDown = true;
  pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
  pullRefreshState(pageModel, RefreshState.Refreshing);
  pageModel.currentPage = 1;
  PageHelper.refreshUI(pageModel, pageAdvModel)
}

export function pullRefreshState(pageModel: PageModel, state: number) {
  switch (state) {
    case RefreshState.DropDown:
      pageModel.pullDownRefreshText = $r('app.string.pull_down_refresh_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_pull_down_refresh');
      pageModel.isCanRefresh = false;
      pageModel.isRefreshing = false;
      pageModel.isVisiblePullDown = true;
      pageModel.load = LoadStatus.PRELOAD
      break;
    case RefreshState.Release:
      pageModel.pullDownRefreshText = $r('app.string.release_refresh_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_pull_up_refresh');
      pageModel.isCanRefresh = true;
      pageModel.isRefreshing = false;
      pageModel.load = LoadStatus.PRELOAD
      break;
    case RefreshState.Refreshing:
      pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
      pageModel.pullDownRefreshText = $r('app.string.refreshing_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_pull_up_load');
      pageModel.isCanRefresh = true;
      pageModel.isRefreshing = true;
      pageModel.load = LoadStatus.LOADING
      break;
    case RefreshState.Success:
      pageModel.pullDownRefreshText = $r('app.string.refresh_success_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_succeed_refresh');
      pageModel.isCanRefresh = true;
      pageModel.isRefreshing = true;
      pageModel.load = LoadStatus.LOADED
      break;
    case RefreshState.Fail:
      pageModel.pullDownRefreshText = $r('app.string.refresh_fail_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_fail_refresh');
      pageModel.isCanRefresh = true;
      pageModel.isRefreshing = true;
      pageModel.load = LoadStatus.LOADED
      break;
    default:
      break;
  }
}

export function closeRefresh(pageModel: PageModel, isRefreshSuccess: boolean) {
  let self = pageModel;
  setTimeout(() => {
    let delay = Const.RefreshConstant_DELAY_PULL_DOWN_REFRESH;
    if (self.isCanRefresh === true) {
      pullRefreshState(pageModel, isRefreshSuccess ? RefreshState.Success : RefreshState.Fail);
      delay = Const.RefreshConstant_DELAY_SHRINK_ANIMATION_TIME;
    }
    animateTo({
      duration: Const.RefreshConstant_CLOSE_PULL_DOWN_REFRESH_TIME,
      delay: delay,
      onFinish: () => {
        pullRefreshState(pageModel, RefreshState.DropDown);
        self.isVisiblePullDown = false;
        self.isPullRefreshOperation = false;
      }
    }, () => {
      self.offsetY = 0;
    })
  }, self.isCanRefresh ? Const.DELAY_ANIMATION_DURATION : 0);
}