2

我现在正在工作以禁用具有滚动视图的水平滚动视图(id:ordermenu)的水平滚动(我的意思是垂直滚动视图。滚动视图的子相对布局的id:category01layout,category02layout,...)作为孩子。

这是它在 XML 中的样子:

Horizo​​ntalScrollView(ordermenu)
- LinearLayout
  - ScrollView
    - RelativeLayout(category01layout)
  - ScrollView
    - RelativeLayout(category02layout)
...
  - ScrollView
    - RelativeLayout(category08layout)

屏幕一次显示一个类别布局,当我按下 prev/next 按钮时,它会设置 Horizo​​ntalscrollview.smoothScrollTo() 来更改类别布局。

因此,当我运行应用程序并滚动时,我的手指同时滚动 Horizo​​ntalScrollView 和 ScrollView。但我不希望我的手指让这两个都听 onScrollChanged。我只希望 ScrollView 听我的手指“只垂直滚动”。因为我不知道如何做到这一点,所以 ScrollView 仅当我沿确切的垂直方向滚动时才会以平滑的方式垂直滚动。否则我的手指也会滚动 Horizo​​ntalScrollView,这是我没想到的。

那么有没有办法禁用水平滚动而只启用垂直滚动呢?

我以前使用过这个方法(创建一个扩展 Horizo​​ntalScrollView 的类)

@Override
protected void onScrollChanged(int x, int y, intoldx, intoldy){
if(Math.abs(x - oldx) <= 50){
mScrollable = false;
}
else {
mScrollable = false;

}
return;
}

但这只是给 UI 带来了很大的负担,使垂直滚动的 ScrollView 变得过于僵硬和缓慢。所以请给我另一种方式。

提前致谢。

4

4 回答 4

0

我的 Horizo​​ntalScrollView 子类中有以下方法,它允许我垂直和水平滚动。基本上,如果它检测到垂直滚动,它就会放弃触摸。玩最小距离取决于它对你的反应程度。

 private float SWIPE_VERT_MIN_DISTANCE = 100;
 private float startlocation = 0;
    private float diffY = 0;
    private boolean vertScroll = false;

    public boolean onInterceptTouchEvent (MotionEvent ev){
        boolean ret = super.onInterceptTouchEvent(ev);



        switch(ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                startlocation = ev.getY();
                vertScroll = false;
                break;
            case MotionEvent.ACTION_MOVE:
                diffY = Math.abs(startlocation - ev.getY());
                if(diffY > SWIPE_VERT_MIN_DISTANCE)
                    vertScroll = true;
                break;
            case MotionEvent.ACTION_UP:
                break;
        }

        if(ret){
            if(vertScroll)
                return false;
            else
                return true;
        }

        return ret;
    }
于 2011-11-15T03:45:09.207 回答
0

我认为您在这里真正想要的是ViewPager。顺便说一句,谷歌的 Android 开发人员经常提到以下规则:

  1. 您不要将滚动视图放在其他滚动视图中。
  2. 您不要将列表视图放在滚动视图中。
于 2011-11-15T05:35:10.537 回答
0

除了您的这个问题,我建议您使用 View Flipper。

然后在其中获取布局(单击下一个/上一个按钮后将更改的布局)。

现在,当单击下一个按钮时,执行 viewFlipper.showNext()/viewFlipper.showPrevious() 动画(如右进/左出)。

因此,您可以在布局上显示平滑的滚动。试试看。我是这样做的。它应该工作。

于 2011-11-15T06:20:29.207 回答
0

尝试使用视图切换器,其中不需要在其他滚动视图中滚动视图和在滚动视图中列出视图。

我希望你很快解决你的问题。

于 2016-04-16T05:11:28.173 回答