将触摸事件从 NestedScrollView 传递到父视图
Pass touch event from NestedScrollView to parent view's
我在 NestedScrollView 下方有一个 ViewPager 宽度,一些顶部填充,clipToPadding(false) 和透明背景(如图像)。
我的 ViewPager 无法获取触摸事件,无法正常工作。
我该如何解决这个问题?
(我无法更改我的结构,也无法将 ViewPager 移动到 NestedScrollView 上方或将 TopMargin 设置为 NestedScrollView)
嵌套滚动视图
nestedScrollView = new NestedScrollView(getContext());
nestedScrollView.setFillViewport(true);
nestedScrollView.setLayoutParams(scrollParams);
nestedScrollView.setClipToPadding(false);
解决方案:
通过覆盖 NestedScrollView 和覆盖 onTouchEvent 解决了这个问题。
(感谢 )
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);
}
}
这种情况有一个解决方法,您可以覆盖 nestedscrollview 中的 onInterceptTouchEvent 和 onTouchEvent。有帖子解释如何去做,https://developer.android.com/training/gestures/viewgroup.html and http://neevek.net/posts/2013/10/13/implementing-onInterceptTouchEvent-and-onTouchEvent-for-ViewGroup.html。当您拦截事件时,根据位置和您的自定义逻辑,您将决定不使用触摸将其留给 viewpager 或让默认的滚动视图逻辑处理它。
我不赞成这个解决方案,但正如你所解释的,你需要让 NestedScrollview 覆盖 viewPager,除非你可以重新考虑限制
我在 NestedScrollView 下方有一个 ViewPager 宽度,一些顶部填充,clipToPadding(false) 和透明背景(如图像)。
我的 ViewPager 无法获取触摸事件,无法正常工作。
我该如何解决这个问题?
(我无法更改我的结构,也无法将 ViewPager 移动到 NestedScrollView 上方或将 TopMargin 设置为 NestedScrollView)
嵌套滚动视图
nestedScrollView = new NestedScrollView(getContext());
nestedScrollView.setFillViewport(true);
nestedScrollView.setLayoutParams(scrollParams);
nestedScrollView.setClipToPadding(false);
解决方案:
通过覆盖 NestedScrollView 和覆盖 onTouchEvent 解决了这个问题。
(感谢
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);
}
}
这种情况有一个解决方法,您可以覆盖 nestedscrollview 中的 onInterceptTouchEvent 和 onTouchEvent。有帖子解释如何去做,https://developer.android.com/training/gestures/viewgroup.html and http://neevek.net/posts/2013/10/13/implementing-onInterceptTouchEvent-and-onTouchEvent-for-ViewGroup.html。当您拦截事件时,根据位置和您的自定义逻辑,您将决定不使用触摸将其留给 viewpager 或让默认的滚动视图逻辑处理它。
我不赞成这个解决方案,但正如你所解释的,你需要让 NestedScrollview 覆盖 viewPager,除非你可以重新考虑限制