在 Android 的 ViewPager2 中检测越界滑动
Detect swiping out of bounds in Android's ViewPager2
我正在使用 ViewPager2 并希望检测用户何时在第一页向左滑动或在最后一页向右滑动。
我知道这可以使用旧的 ViewPager
来实现,就像 here 所讨论的那样,但是这种方法不可行,因为 ViewPager2
是最终的并且不能被子类化。
ViewPager2
提供了 OnPageChangeCallback 但这也不能使用,因为在越界时没有页面事件。
我是不是漏掉了什么?
我在输入这个问题时想出了一个(有点老套的)解决方案。
基于观察,只有当viewpager真正落户到一个新页面时,才会达到状态SCROLL_STATE_SETTLING
。如果在第一页或最后一页上只有无结果的拖动,则只有 SCROLL_STATE_DRAGGING
和最后 SCROLL_STATE_IDLE
状态通过。
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
private boolean settled = false;
@Override
public void onPageScrollStateChanged(int state) {
super.onPageScrollStateChanged(state);
if (state == SCROLL_STATE_DRAGGING) {
settled = false;
}
if (state == SCROLL_STATE_SETTLING) {
settled = true;
}
if (state == SCROLL_STATE_IDLE && !settled) {
doYourOutOfBoundsStuff();
}
}
});
我不是很开心,但这是我迄今为止遇到的最好的。
我正在使用 ViewPager2 并希望检测用户何时在第一页向左滑动或在最后一页向右滑动。
我知道这可以使用旧的 ViewPager
来实现,就像 here 所讨论的那样,但是这种方法不可行,因为 ViewPager2
是最终的并且不能被子类化。
ViewPager2
提供了 OnPageChangeCallback 但这也不能使用,因为在越界时没有页面事件。
我是不是漏掉了什么?
我在输入这个问题时想出了一个(有点老套的)解决方案。
基于观察,只有当viewpager真正落户到一个新页面时,才会达到状态SCROLL_STATE_SETTLING
。如果在第一页或最后一页上只有无结果的拖动,则只有 SCROLL_STATE_DRAGGING
和最后 SCROLL_STATE_IDLE
状态通过。
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
private boolean settled = false;
@Override
public void onPageScrollStateChanged(int state) {
super.onPageScrollStateChanged(state);
if (state == SCROLL_STATE_DRAGGING) {
settled = false;
}
if (state == SCROLL_STATE_SETTLING) {
settled = true;
}
if (state == SCROLL_STATE_IDLE && !settled) {
doYourOutOfBoundsStuff();
}
}
});
我不是很开心,但这是我迄今为止遇到的最好的。