package tellh.com.gitclub.presentation.widget; import android.content.Context; import android.graphics.Bitmap; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.http.SslError; import android.support.v4.content.ContextCompat; import android.support.v4.view.NestedScrollingChild; import android.support.v4.view.NestedScrollingChildHelper; import android.util.AttributeSet; import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; import tellh.com.gitclub.R; /** * Created by tlh on 2016/9/22 :) */ public class NestProgressWebView extends WebView implements NestedScrollingChild { private NestedScrollingChildHelper mChildHelper; private ProgressBar progressbar; private int mLastMotionY; private final int[] mScrollOffset = new int[2]; private final int[] mScrollConsumed = new int[2]; private int mNestedYOffset; public NestProgressWebView(Context context) { this(context, null); } public NestProgressWebView(Context context, AttributeSet attrs) { super(context, attrs); mChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); //progress bar progressbar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal); progressbar.setProgressDrawable(ContextCompat.getDrawable(getContext(), R.drawable.progressbar)); progressbar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 5, 0, 0)); addView(progressbar); setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); if (newProgress == 100) { progressbar.setProgress(newProgress); progressbar.postDelayed(new Runnable() { @Override public void run() { progressbar.setVisibility(INVISIBLE); } }, 200); } else { if (progressbar.getVisibility() == INVISIBLE) progressbar.setVisibility(VISIBLE); progressbar.setProgress(newProgress); } } }); //Client setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { view.loadUrl(request.toString()); return true; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); progressbar.setVisibility(VISIBLE); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); progressbar.setVisibility(INVISIBLE); } }); //setting WebSettings settings = getSettings(); settings.setUseWideViewPort(true); settings.setAppCacheEnabled(true); settings.setDatabaseEnabled(true); settings.setDomStorageEnabled(true); settings.setCacheMode(WebSettings.LOAD_DEFAULT); ConnectivityManager connectivityManager = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo.isAvailable()) { settings.setCacheMode(WebSettings.LOAD_DEFAULT); } else { settings.setCacheMode(WebSettings.LOAD_CACHE_ONLY); } } public void goBackPage() { if (canGoBack()) goBack(); } // @Override // public boolean onTouchEvent(MotionEvent event) { // boolean result = false; // // MotionEvent trackedEvent = MotionEvent.obtain(event); // // final int action = MotionEventCompat.getActionMasked(event); // // if (action == MotionEvent.ACTION_DOWN) { // mNestedYOffset = 0; // } // // int y = (int) event.getY(); // // event.offsetLocation(0, mNestedYOffset); // // switch (action) { // case MotionEvent.ACTION_DOWN: // mLastMotionY = y; // startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL); // result = super.onTouchEvent(event); // break; // case MotionEvent.ACTION_MOVE: // int deltaY = mLastMotionY - y; // // if (dispatchNestedPreScroll(0, deltaY, mScrollConsumed, mScrollOffset)) { // deltaY -= mScrollConsumed[1]; // trackedEvent.offsetLocation(0, mScrollOffset[1]); // mNestedYOffset += mScrollOffset[1]; // } // // int oldY = getScrollY(); // mLastMotionY = y - mScrollOffset[1]; // if (deltaY < 0) { // int newScrollY = Math.max(0, oldY + deltaY); // deltaY -= newScrollY - oldY; // if (dispatchNestedScroll(0, newScrollY - deltaY, 0, deltaY, mScrollOffset)) { // mLastMotionY -= mScrollOffset[1]; // trackedEvent.offsetLocation(0, mScrollOffset[1]); // mNestedYOffset += mScrollOffset[1]; // } // } // // trackedEvent.recycle(); // result = super.onTouchEvent(trackedEvent); // break; // case MotionEvent.ACTION_POINTER_DOWN: // case MotionEvent.ACTION_UP: // case MotionEvent.ACTION_CANCEL: // stopNestedScroll(); // result = super.onTouchEvent(event); // break; // } // return result; // } @Override public void setNestedScrollingEnabled(boolean enabled) { mChildHelper.setNestedScrollingEnabled(enabled); } @Override public boolean isNestedScrollingEnabled() { return mChildHelper.isNestedScrollingEnabled(); } @Override public boolean startNestedScroll(int axes) { return mChildHelper.startNestedScroll(axes); } @Override public void stopNestedScroll() { mChildHelper.stopNestedScroll(); } @Override public boolean hasNestedScrollingParent() { return mChildHelper.hasNestedScrollingParent(); } @Override public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) { return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); } @Override public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); } @Override public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); } @Override public boolean dispatchNestedPreFling(float velocityX, float velocityY) { return mChildHelper.dispatchNestedPreFling(velocityX, velocityY); } }