我在ViewPager中放置了一个水平滚动视图.目标是仅使用软件触发的水平滚动视图滚动.所有滚动手势都应由视图寻呼机处理.
我已经通过创建一个拦截所有滑动手势的自定义view Pager来完成它:
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的下一个位置.
知道如何让它变得更好吗?
解决方法
为了解决这个问题,我遵循了以下步骤:
首先,我创建了一个自定义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);