【问题标题】:Android- disable horizontal scrolling of horizontalscrollview which has scrollview as childrenAndroid-禁用以scrollview为子项的horizo​​ntalscrollview的水平滚动
【发布时间】:2011-11-15 03:22:52
【问题描述】:

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

这是它在 XML 中的样子:

Horizo​​ntalScrollView(ordermenu)
- 线性布局
- 滚动视图
- 相对布局(category01layout)
- 滚动视图
- 相对布局(category02layout)
...
- 滚动视图
- 相对布局(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 变得过于僵硬和缓慢。所以请给我另一种方式。

提前致谢。

【问题讨论】:

    标签: android scrollview horizontalscrollview


    【解决方案1】:

    我的 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;
        }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,所以我将代码更改为 viewflipper 中的滚动视图。谢谢~
      【解决方案3】:

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

      然后将布局(点击下一个/上一个按钮后将更改的布局)放入其中。

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

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

      【讨论】:

        【解决方案4】:

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

        祝你早日解决问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-17
          • 1970-01-01
          • 2018-10-05
          • 1970-01-01
          相关资源
          最近更新 更多