我有一个基本的ViewPager2
垂直方向,由2个Fragments
组成。
在Fragment
2内,我有一个垂直的ScrollView
。
两个垂直滚动都存在冲突,并且无法正常工作。我知道有很多类似的问题,但是我发现并尝试的所有方法都失败了。
我正在寻找一种可以处理两个触摸事件的解决方案。
任何代码示例或致谢
答案 0 :(得分:1)
我终于通过编写自定义滚动视图来处理两个垂直滚动来解决问题:
public class CustomScrollView extends NestedScrollView {
public CustomScrollView(@NonNull Context context) {
super(context);
}
public CustomScrollView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public CustomScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
float startY, dy;
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
if (scrollY > 15) { // 10 - 15 -> avoid fake mouv
viewPager2.setUserInputEnabled(false);
}
else {
viewPager2.setUserInputEnabled(true);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
startY = ev.getRawY();
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
startY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
dy = ev.getRawY() - startY;
if (dy > -5 && dy < 70) { // range tested on 5 devices but can be modified
return false;
}
else {
viewPager2.setUserInputEnabled(false);
}
break;
}
return super.onTouchEvent(ev);
}
}