Android-禁用horizo​​ntalscrollview的水平滚动,滚动视图为子视图

时间:2011-11-15 03:22:53

标签: android scrollview horizontalscrollview

我现在正在努力禁用水平滚动horizo​​ntalscrollview(id:ordermenu),它有滚动视图(我的意思是纵向滚动视图。我的scrollview的子relativelayout的id:category01layout,category02layout,...)作为子项。

以下是XML中的内容:

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

屏幕一次显示一个类别布局,当我按上一个/下一个按钮时,它会设置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 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:0)

我认为你真正想要的是ViewPager。顺便提一下,谷歌的Android开发者经常提到以下规则:

  1. 您不会将滚动视图放在其他滚动视图中。
  2. 您不会将列表视图放在滚动视图中。

答案 2 :(得分:0)

除了你的这个问题,我建议你带一个View Flipper。

然后选择布局(在点击下一个/上一个按钮后将会更改的布局)。

现在,当点击下一个按钮时,请使用动画执行viewFlipper.showNext()/ viewFlipper.showPrevious()(如右侧/左侧)。

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

答案 3 :(得分:0)

尝试使用视图切换器,其中无需在滚动视图内的其他滚动视图和列表视图中滚动视图。

我希望你能尽快解决问题。