Android 如何在ViewPager中禁用水平滚动视图的滚动
我在ViewPager中放置了一个水平滚动视图。目标是仅使用软件触发的水平滚动视图滚动。所有的滚动手势都应该由视图寻呼机处理 我已经创建了一个自定义视图寻呼机来截取所有滑动手势:Android 如何在ViewPager中禁用水平滚动视图的滚动,android,android-layout,android-viewpager,android-view,Android,Android Layout,Android Viewpager,Android View,我在ViewPager中放置了一个水平滚动视图。目标是仅使用软件触发的水平滚动视图滚动。所有的滚动手势都应该由视图寻呼机处理 我已经创建了一个自定义视图寻呼机来截取所有滑动手势: public class GreedyViewPager extends ViewPager { GestureDetector mGestureDetector; View.OnTouchListener mGestureListener; public GreedyViewPager(C
public class GreedyViewPager extends ViewPager {
GestureDetector mGestureDetector;
View.OnTouchListener mGestureListener;
public GreedyViewPager(Context context) {
super(context);
initGestureDetector(context);
}
public GreedyViewPager(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
initGestureDetector(context);
}
void initGestureDetector(Context context){
mGestureDetector = new GestureDetector(context, new ScrollDetector());
ViewConfiguration vc = ViewConfiguration.get(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev) || mGestureDetector.onTouchEvent(ev);
}
class ScrollDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return true;
}
}
}
不幸的是,它并不适用于所有设备,有时我必须滑动几次才能转到ViewPager中的下一个位置
你知道如何做得更好吗?这就是你需要的吗
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
if(ev.getAction()==MotionEvent.ACTION_MOVE)
return true;
return super.dispatchTouchEvent(ev);
}
您需要创建一个自定义的滚动视图,覆盖InterceptTouchEvent上的
并从中返回false
public class StoppableScrollView extends ScrollView {
public StoppableScrollView(Context context) {
super(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}为了解决这个问题,我遵循了以下步骤:
首先,我创建了一个自定义的HorizontalScrollView类:
public class MyScrollView extends HorizontalScrollView{
public MyScrollView(Context context) {
super(context);
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX,boolean clampedY) {
Log.e(" horizontal ", " - "+scrollX);
// here i call the listener i have created
scrollViewListener.onHorizontalScrollChanged(scrollX, scrollY);
super.onOverScrolled(0, scrollY, true, true);
}
// i create a scroll view listener, and i instantiate this from main Activity
private ScrollViewListener scrollViewListener = null;
public interface ScrollViewListener {
void onHorizontalScrollChanged(int x, int y);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
}
}
在您的主要活动中,执行以下操作:
implements MyScrollView.ScrollViewListener
@Override
public void onHorizontalScrollChanged(int x, int y) {
// In your ViewPager call this method
mPager.scrollBy(x, y);
}
此外,在onCreate的MainActivity中,您还必须添加以下内容:
// i have also added this custom HorizontalScrollView to my XML
MyScrollView myScrollView = (MyScrollView) findViewById(R.id.h_scroll);
myScrollView.setScrollViewListener(this);
我实现了这段代码,它对我有效,我希望它对你也有效:)尝试设置viewpager的子代焦点
viewPager.setDescendantFocusability(ViewPager.FOCUS_BEFORE_DESCENDANTS);
另一个联系可能是useful@Pragna我想做一些相反的事情,此解决方案锁定ViewPager,我不希望ViewPager拦截所有滚动事件。请使用此ViewPager.SetDegenantFocusability(ViewPager.FOCUS在子体之前)@卡马尔你能修好吗?我今天也面临同样的问题,在子代不起作用之前集中注意力并不容易,滚动事件包括动作向下、动作移动和动作向上。有时甚至会有不同的配置,例如双击并在第二次单击后立即滚动。我已经尝试过了。它可以工作,但水平滚动视图中的项目不可单击。我只需要截取滚动事件。