From 58751695456607594c962487d380b0880023dd14 Mon Sep 17 00:00:00 2001 From: arvinwli Date: Mon, 30 Oct 2023 20:16:53 +0800 Subject: [PATCH] viewpager:support scrollEventThrottle --- .../src/components/ViewPager/index.jsx | 1 + .../hippy/views/viewpager/HippyViewPager.java | 7 +++++++ .../viewpager/HippyViewPagerController.java | 4 ++++ .../ViewPagerPageChangeListener.java | 20 ++++++++++++++++++- 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/driver/js/examples/hippy-react-demo/src/components/ViewPager/index.jsx b/driver/js/examples/hippy-react-demo/src/components/ViewPager/index.jsx index affccccf92a..43b9c2672fc 100644 --- a/driver/js/examples/hippy-react-demo/src/components/ViewPager/index.jsx +++ b/driver/js/examples/hippy-react-demo/src/components/ViewPager/index.jsx @@ -109,6 +109,7 @@ export default class PagerExample extends React.Component { onPageSelected={this.onPageSelected} onPageScrollStateChanged={this.onPageScrollStateChanged} onPageScroll={this.onPageScroll} + scrollEventThrottle={1000} > { [ diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/HippyViewPager.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/HippyViewPager.java index e979903229a..c30de96c7fb 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/HippyViewPager.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/HippyViewPager.java @@ -69,6 +69,9 @@ public void run() { private final int[] mScrollOffsetPair = new int[2]; private int mNestedScrollOffset = 0; + protected int mScrollEventThrottle = 400; // 400ms最多回调一次 + + private void init(Context context, boolean isVertical) { setCallPageChangedOnFirstLayout(true); setEnableReLayoutOnAttachToWindow(false); @@ -328,6 +331,10 @@ public void setOverflow(String overflow) { invalidate(); } + public void setScrollEventThrottle(int scrollEventThrottle) { + mScrollEventThrottle = scrollEventThrottle; + } + @Override public boolean onStartNestedScroll(@NonNull View child, @NonNull View target, int axes) { if (!isScrollEnabled()) { diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/HippyViewPagerController.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/HippyViewPagerController.java index 06493a63a8e..4a6dfbf63da 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/HippyViewPagerController.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/HippyViewPagerController.java @@ -132,6 +132,10 @@ public void setOverflow(HippyViewPager pager, String overflow) { pager.setOverflow(overflow); } + @HippyControllerProps(name = "scrollEventThrottle", defaultType = HippyControllerProps.NUMBER, defaultNumber = 30.0D) + public void setScrollEventThrottle(HippyViewPager pager,int scrollEventThrottle) { + pager.setScrollEventThrottle(scrollEventThrottle); + } private void resolveInvalidParams(@Nullable Promise promise) { if (promise != null) { String msg = "Invalid parameter!"; diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/ViewPagerPageChangeListener.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/ViewPagerPageChangeListener.java index f56d5d154a8..1320d8ba193 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/ViewPagerPageChangeListener.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/viewpager/ViewPagerPageChangeListener.java @@ -16,6 +16,7 @@ package com.tencent.mtt.hippy.views.viewpager; +import android.os.SystemClock; import android.view.View; import androidx.annotation.NonNull; @@ -34,14 +35,30 @@ public class ViewPagerPageChangeListener implements ViewPager.OnPageChangeListen private int mLastPageIndex = 0; private int mCurrPageIndex = 0; private final HippyViewPager mPager; + private long mLastScrollEventTimeStamp = -1; public ViewPagerPageChangeListener(@NonNull HippyViewPager pager) { mPager = pager; } + /** + * 检查是否需要发送事件 + * @return + */ + protected boolean checkSendOnScrollEvent() { + if (mPager.isScrollEnabled()) { + long currTime = SystemClock.elapsedRealtime(); + if (currTime - mLastScrollEventTimeStamp >= mPager.mScrollEventThrottle) { + mLastScrollEventTimeStamp = currTime; + return true; + } + } + return false; + } + @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - if (mPager != null) { + if (mPager != null && checkSendOnScrollEvent()) { Map params = new HashMap<>(); params.put(PAGE_ITEM_POSITION, position); params.put(PAGE_ITEM_OFFSET, positionOffset); @@ -91,6 +108,7 @@ private void onScrollStateChangeToIdle() { params.put(PAGE_ITEM_POSITION, mLastPageIndex); EventUtils.sendComponentEvent(lastView, EventUtils.EVENT_PAGE_ITEM_DID_DISAPPEAR, params); mLastPageIndex = mCurrPageIndex; + mLastScrollEventTimeStamp = -1; } @Override