先說結(jié)論
嵌套后webview豎向滑動(dòng)一卡一卡的播掷,最后修改ViewPager2的最小切換頁面邊距降低切換靈敏度烘豹,使一些常規(guī)滑動(dòng)不會(huì)被攔截
try {
final Field recyclerViewField = ViewPager2.class.getDeclaredField("mRecyclerView");
recyclerViewField.setAccessible(true);
final RecyclerView recyclerView = (RecyclerView) recyclerViewField.get(viewPager);
final Field touchSlopField = RecyclerView.class.getDeclaredField("mTouchSlop");
touchSlopField.setAccessible(true);
final int touchSlop = (int) touchSlopField.get(recyclerView);
touchSlopField.set(recyclerView, touchSlop*5);//通過獲取原有的最小滑動(dòng)距離 *n來增加此值
} catch (Exception ignore) {
}
處理完垂直滑動(dòng),又來了橫向滑動(dòng)
addJavascriptInterface WebView網(wǎng)頁端通知原生是否需要橫向滑動(dòng),設(shè)置boolean標(biāo)志
webMoveX = (TextUtils.equals(event,"DOWN")||TextUtils.equals(event,"MOVE_X"));
重寫onTouchEvent在webview需要滑動(dòng)的時(shí)候通知父控件不要攔截事件
@Override
public boolean onTouchEvent(MotionEvent event) {
if (webMoveX) {
super.requestDisallowInterceptTouchEvent(true);
}
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
downFlag = true;
break;
case MotionEvent.ACTION_MOVE:
float dx = Math.abs(event.getX() - startX);
float dy = Math.abs(event.getY() - startY);
//首次為豎直滑動(dòng) 后續(xù)滑動(dòng)webview處理
if (downFlag && dy > dx){
super.requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
downFlag = false;
break;
}
return super.onTouchEvent(event);
}
提供一個(gè)簡易處理初始上下滑動(dòng)WebView然后左右滑動(dòng)觸發(fā)ViewPager2切換沖突的方案
//重寫webview onScrollChanged 優(yōu)先響應(yīng)webview內(nèi)部滑動(dòng) 如果webview內(nèi)部滑動(dòng)完成瘟裸,則響應(yīng)外部的滑動(dòng),把webview包含到下拉刷新后此方法不調(diào)用了棍郎,調(diào)用的是下拉刷新的該方法.待研究...
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
//處理初始上下滑動(dòng)WebView然后左右滑動(dòng)觸發(fā)ViewPager2切換
super.requestDisallowInterceptTouchEvent(true);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (webMoveX) {
super.requestDisallowInterceptTouchEvent(true);
}
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
downFlag = true;
break;
case MotionEvent.ACTION_MOVE:
float dx = Math.abs(event.getX() - startX);
float dy = Math.abs(event.getY() - startY);
//首次為豎直滑動(dòng)且非下拉刷新 后續(xù)滑動(dòng)webview處理
if (!pullToRefresh && downFlag && dy > dx){
super.requestDisallowInterceptTouchEvent(true);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
downFlag = false;
break;
}
return super.onTouchEvent(event);
}