在ViewPager, ScrollView, ListView等容器控件中內(nèi)嵌了webview环壤,特別是webview的大小固定的情況下倔叼,會(huì)出現(xiàn)滑動(dòng)的沖突逃片,可以采用如下自定義的webview來完美解決兼贡。
當(dāng)webview滑動(dòng)到邊界到時(shí)候攻冷,ViewPager,ListView或ScrollView才可以滾動(dòng)
package com.leo.demo;
import android.content.Context;
import android.os.Build;
import android.support.v4.view.MotionEventCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class NestWebView extends WebView {
// 是否垂直滾動(dòng)
boolean isScrollV;
// 是否水平滾動(dòng)
// boolean isScrollH;
public NestWebView(Context context) {
super(context);
init();
}
public NestWebView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public NestWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
WebSettings settings = getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true);
settings.setDatabaseEnabled(true);
settings.setPluginState(WebSettings.PluginState.ON_DEMAND);
settings.setRenderPriority(WebSettings.RenderPriority.HIGH);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
settings.setMediaPlaybackRequiresUserGesture(false);
}
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setSupportMultipleWindows(false);
setWebChromeClient(new WebChromeClient());
setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (MotionEventCompat.getPointerCount(event) == 1) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isScrollV = false;
//isScrollH = false;
//事件由webview處理
getParent().getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
// 垂直viewpager遍希,scrollview等曼,listview等
getParent().getParent().requestDisallowInterceptTouchEvent(!isScrollV);
//嵌套Viewpager時(shí)
// getParent().getParent().requestDisallowInterceptTouchEvent(!isScrollH);
break;
default:
getParent().getParent().requestDisallowInterceptTouchEvent(false);
}
} else {
//使webview可以雙指縮放(前提是webview必須開啟縮放功能,并且加載的網(wǎng)頁(yè)也支持縮放)
getParent().getParent().requestDisallowInterceptTouchEvent(true);
}
return super.onTouchEvent(event);
}
//當(dāng)webview滾動(dòng)到邊界時(shí)執(zhí)行
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
isScrollV = clampedY;
//isScrollH = clampedX;
}
}