我现在正在努力禁用水平滚动horizontalscrollview(id:ordermenu),它有滚动视图(我的意思是纵向滚动视图。我的scrollview的子relativelayout的id:category01layout,category02layout,...)作为子项。
以下是XML中的内容:
HorizontalScrollView(ordermenu)
- LinearLayout
- ScrollView
- RelativeLayout(category01layout)
- ScrollView
- RelativeLayout(category02layout)
...
- ScrollView
- RelativeLayout(category08layout)
屏幕一次显示一个类别布局,当我按上一个/下一个按钮时,它会设置horizontalscrollview.smoothScrollTo()来更改类别布局。
因此,当我运行应用程序并滚动时,我的手指会滚动HorizontalScrollView和ScrollView。但是我不想让我的手指让这两个人听到onScrollChanged。我只希望ScrollView听我的手指'只能垂直滚动'。由于我不知道如何做到这一点,只有当我在一个精确的垂直方向滚动时,ScrollView才能以平滑的方式垂直滚动。否则我的手指也会滚动HorizontalScrollView,这是我没想到的。
那么有没有办法禁用水平滚动并只启用垂直滚动?
我之前使用过这种方法(创建一个扩展HorizontalScrollView的类)
@Override
protected void onScrollChanged(int x, int y, intoldx, intoldy){
if(Math.abs(x - oldx) <= 50){
mScrollable = false;
}
else {
mScrollable = false;
}
return;
}
但这只会给UI带来很多负担,使得垂直滚动ScrollView过于僵硬和缓慢。所以请给我另一种方式。
提前致谢。
答案 0 :(得分:0)
我在HorizontalScrollView的子类中有以下方法,它允许我垂直和水平滚动。基本上,如果它检测到垂直滚动,它会放弃触摸。根据对您的响应程度,以最小距离进行游戏。
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开发者经常提到以下规则:
答案 2 :(得分:0)
除了你的这个问题,我建议你带一个View Flipper。
然后选择布局(在点击下一个/上一个按钮后将会更改的布局)。
现在,当点击下一个按钮时,请使用动画执行viewFlipper.showNext()/ viewFlipper.showPrevious()(如右侧/左侧)。
因此,您可以在布局上显示平滑的标量。试试吧。我是这样做的。它应该工作。
答案 3 :(得分:0)
尝试使用视图切换器,其中无需在滚动视图内的其他滚动视图和列表视图中滚动视图。
我希望你能尽快解决问题。