现在的位置: 首页 > 综合 > 正文

笔记67–ViewPager+ScrollView+ListView/GridView

2018年07月12日 ⁄ 综合 ⁄ 共 1339字 ⁄ 字号 评论关闭

解决方法:

1、重写ScrollView。-------此解决方式有bug

public class MyScrollView extends ScrollView {
	private GestureDetector mGestureDetector;  

	public MyScrollView(Context context, AttributeSet attrs) {  
		super(context, attrs);  
		mGestureDetector = new GestureDetector(context, new YScrollDetector());  
	}  

	@Override  
	public boolean onInterceptTouchEvent(MotionEvent ev) {  
		return super.onInterceptTouchEvent(ev)  
				&& mGestureDetector.onTouchEvent(ev);  
	}  

	class YScrollDetector extends SimpleOnGestureListener {  

		@Override  
		public boolean onScroll(MotionEvent e1, MotionEvent e2,  
				float distanceX, float distanceY) {  
			/** 
			 * 如果我们滚动更接近水平方向,返回false,让子视图来处理它 
			 */  
			 return (Math.abs(distanceY) > Math.abs(distanceX));  
		}  
	}  
}

此ScrollView同样适用于ScrollView中ListView等其他View无法滚动。

2、上述解决方式在包含listview+viewpager+ScrollView时,有bug。这种情况,需重写ListView(参考之前的博客)和ScrollView:

public class ScrollViewExtend extends ScrollView {  
	
	
    // 滑动距离及坐标  
    private float xDistance, yDistance, xLast, yLast;  
  
    public ScrollViewExtend(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    @Override  
    public boolean onInterceptTouchEvent(MotionEvent ev) {  
        switch (ev.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
                xDistance = yDistance = 0f;  
                xLast = ev.getX();  
                yLast = ev.getY();  
                break;  
            case MotionEvent.ACTION_MOVE:  
                final float curX = ev.getX();  
                final float curY = ev.getY();  
                  
                xDistance += Math.abs(curX - xLast);  
                yDistance += Math.abs(curY - yLast);  
                xLast = curX;  
                yLast = curY;  
                  
                if(xDistance > yDistance){  
                    return false;  
                }    
        }  
  
        return super.onInterceptTouchEvent(ev);  
    }  
} 

抱歉!评论已关闭.