gpt4 book ai didi

Android - ViewPager 滚动重置

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:17:02 24 4
gpt4 key购买 nike

我在我的应用程序中使用 ViewPager,它包含图像的水平布局以实现分页画廊。

当我单独测试 View 时,即作为 Activity 的主视图,它工作正常。但是,当我将其作为另一个布局的一部分时,滚动(或轻弹)变得很奇怪。如果似乎在滑动的一半左右重置到其原始位置(真正快速的轻弹是我到目前为止唯一能做的事情)。

知道问题出在哪里吗?

以防万一它有任何相关性, View 从 XML 扩展并添加到 PagerAdapter 继承类中。

最佳答案

是的,ViewPager 和其他滚动项在默认情况下不能很好地协同工作。当我必须做这样的事情时,我通常会子类化 ViewPager 来制作一些可以滚动的子类。然后在我的 onInterceptTouchEvent() 中,我检查 hit 矩形是否在那个 child 内,并且不拦截触摸事件,这样 child 就会受到打击。像这样:

/**
* Override to not intercept touch events within our scroller if it exists.
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(scrollerId != 0) {
View scroller = findViewById(scrollerId);
if(scroller != null) {
Rect rect = new Rect();
scroller.getHitRect(rect);
if(rect.contains((int)ev.getX(), (int)ev.getY())) {
return false;
}
}
}
return super.onInterceptTouchEvent(ev);
}

那么您所需要的只是一种设置该 scrollerId 的方法(一个简单的公共(public)方法即可)。

请注意,另一种方法是,如果您使用 ScrollView垂直 滚动元素和 ViewPager children,您需要转向不同的方向。有一个 ScrollView 的子类,它检测垂直滚动方向并阻止水平滚动,以便 ViewPager 接收它。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
lastX = ev.getX();
lastY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - lastX);
yDistance += Math.abs(curY - lastY);
lastX = curX;
lastY = curY;
if (xDistance > yDistance)
return false;
}

return super.onInterceptTouchEvent(ev);
}

关于Android - ViewPager 滚动重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9179314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com