我在ViewPager中放置了一个水平滚动视图。目标是仅使用软件触发的水平滚动视图滚动。所有滚动手势都应由视图寻呼机处理。
我已经通过创建一个拦截所有滑动手势的自定义View Page来完成它:
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的下一个位置。
知道如何让它更好吗?
答案 0 :(得分:4)
要解决这个问题,我已按照以下步骤操作:
首先我创建了一个自定义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);
}
}
在您的MainActivity中实现:
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);
我实现了这段代码,它对我有用,我希望它对您有效:)
答案 1 :(得分:1)
您需要创建自定义ScrollView并覆盖onInterceptTouchEvent
并从中返回false。
public class StoppableScrollView extends ScrollView {
public StoppableScrollView(Context context) {
super(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}
答案 2 :(得分:0)
这是你需要的吗?
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
if(ev.getAction()==MotionEvent.ACTION_MOVE)
return true;
return super.dispatchTouchEvent(ev);
}
答案 3 :(得分:0)
尝试设置viewpager的DescendantFocusability。
viewPager.setDescendantFocusability(ViewPager.FOCUS_BEFORE_DESCENDANTS);