Java 如何仅截取scrollview中具有特定角度的运动事件?

Java 如何仅截取scrollview中具有特定角度的运动事件?,java,android,Java,Android,我试图禁用特定角度的垂直滚动视图,但没有成功 这背后的目标是正确处理嵌套在垂直滚动视图中的多个水平ListView 我试过这个,但不起作用: public class VScrollView extends ScrollView { private GestureDetector mGestureDetector; View.OnTouchListener mGestureListener; public VScrollView(Context context) {

我试图禁用特定角度的垂直滚动视图,但没有成功

这背后的目标是正确处理嵌套在垂直滚动视图中的多个水平ListView

我试过这个,但不起作用:

public class VScrollView extends ScrollView {

    private GestureDetector mGestureDetector;
    View.OnTouchListener mGestureListener;

    public VScrollView(Context context) {
        super(context);
        mGestureDetector = new GestureDetector(context, new YScrollDetector());
        setFadingEdgeLength(0);
    }

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

    public VScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mGestureDetector = new GestureDetector(context, new YScrollDetector());
        setFadingEdgeLength(0);
    }

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


    class YScrollDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            if (e1 != null && e2 != null) {
                double delta_x = (e1.getX() - e2.getX());
                double delta_y = (e1.getY() - e2.getY());
                double radians = Math.abs(Math.toDegrees(Math.atan2(delta_y, delta_x)));
                if (radians > 80 && radians < 100) {
                    return true;
                }
            }
            return false;
        }
    }
}
public类VScrollView扩展了ScrollView{
私人手势检测器mGestureDetector;
View.OnTouchListener mGestureListener;
公共VScrollView(上下文){
超级(上下文);
mGestureDetector=新的GestureDetector(上下文,新的YScrollDetector());
设置FadingEdgeLength(0);
}
公共VScrollView(上下文、属性集属性){
超级(上下文,attrs);
mGestureDetector=新的GestureDetector(上下文,新的YScrollDetector());
设置FadingEdgeLength(0);
}
公共VScrollView(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
mGestureDetector=新的GestureDetector(上下文,新的YScrollDetector());
设置FadingEdgeLength(0);
}
@凌驾
公共布尔值onInterceptTouchEvent(MotionEvent ev){
返回超级onInterceptTouchEvent(ev)和&mGestureDetector.onTouchEvent(ev);
}
类YScrollDetector扩展了GestureDetector.SimpleOnGestureListener{
@凌驾
公共布尔onScroll(MotionEvent e1、MotionEvent e2、浮点距离X、浮点距离Y){
如果(e1!=null&&e2!=null){
双增量x=(e1.getX()-e2.getX());
双增量y=(e1.getY()-e2.getY());
双弧度=Math.abs(Math.toDegrees(Math.atan2(delta_y,delta_x));
如果(弧度>80和弧度<100){
返回true;
}
}
返回false;
}
}
}

我知道这可能是你不想听的,但谷歌一直要求我们不要这样做

参考谷歌的说法

绝不应将水平滚动视图与ListView[…]一起使用