将NestedScrollView中的触摸事件传递给父视图

6
我有一个ViewPager在NestedScrollView下面,有一些顶部填充,clipToPadding(false)和透明背景(如图像)。
我的ViewPager无法获取触摸事件并且无法工作。
我该如何解决这个问题?
(我不能改变我的结构,也不能将ViewPager移动到NestedScrollView的上方或将TopMargin设置为NestedScrollView)

ViewPager below a transparent NestedScrollView

ViewPager below a transparent NestedScrollView

嵌套滚动视图

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

解决方案:

这个问题可以通过重写NestedScrollView和覆盖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);
    }

}

6
谈论布局结构时,这应该成为图片外观的新标准。 - DeeV
无论如何,当ScrollView消失时,Viewpager是否能正常工作?我怀疑ScrollView在触摸事件到达Viewpager之前拦截了它们。 - DeeV
@DeeV 是的,它有效。当我将ViewPager放在ScrollView的顶部时,它也可以工作。 - Alireza MH
使用<Space>代替topPadding是一个选项吗? - petrumo
如果您可以通过在 NestedScrollView 之前添加 <Space> 视图来推下它,那么是否存在与 topMargin 相同的约束条件? - petrumo
显示剩余3条评论
1个回答

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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接