将触摸事件从NestedScrollView传递到父视图

时间:2016-12-13 15:38:41

标签: android android-viewpager touch-event android-nestedscrollview

我的ViewPager在NestedScrollView宽度下方有一些顶部填充,clipToPadding(false)和透明背景(如图像)。

我的ViewPager无法获取触摸事件但无效。

我该如何解决这个问题?

(我无法更改我的结构,无法将ViewPager移动到NestedScrollView以上或将TopMargin设置为NestedScrollView)

ViewPager below a transparent NestedScrollView

ViewPager below a transparent NestedScrollView

NestedScrollView

nestedScrollView = new NestedScrollView(getContext());
nestedScrollView.setFillViewport(true);
nestedScrollView.setLayoutParams(scrollParams);
nestedScrollView.setClipToPadding(false);

解决方案:

通过覆盖NestedScrollView和Override onTouchEvent解决了这个问题。 (感谢@petrumo

public class MyNestedScrollView extends NestedScrollView {
    private boolean topZone = false;

    public MyNestedScrollView(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if(ev.getAction() == MotionEvent.ACTION_DOWN ){
            topZone = (getPaddingTop() - getScrollY() >  ev.getY());
        }

        if(topZone){
            if(ev.getAction() == MotionEvent.ACTION_UP){
                topZone = false;
            }
            return false;
        }
        return super.onTouchEvent(ev);
    }

}

1 个答案:

答案 0 :(得分:1)

这种情况有一种解决方法,您可以在nestedscrollview中覆盖onInterceptTouchEvent和onTouchEvent。有些帖子解释了如何执行此操作,https://developer.android.com/training/gestures/viewgroup.htmlhttp://neevek.net/posts/2013/10/13/implementing-onInterceptTouchEvent-and-onTouchEvent-for-ViewGroup.html。截取事件时,根据位置和自定义逻辑,您决定不使用触摸将其保留给viewpager,或让默认的scrollview逻辑处理它。

我不赞成这个解决方案,但正如您解释的那样,您需要让NestedScrollview覆盖viewPager,除非您可以重新考虑这些限制