webview的使用

权限:

<!--webview必加Internet-->
<uses-permission android:name="android.permission.INTERNET" />
<!--判断网络状态:是否有网络-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

监听webview的滚动:接口回调

package com.example.lenovo.mywebtest;

import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;

/**
 * 监听webview的滚动
 * <p>
 * Created by lenovo on 2017/8/16.
 */

public class ObserveWebView extends WebView {

    private OnWebViewListener webViewListener = null;

    public ObserveWebView(Context context) {
        super(context);
    }

    public ObserveWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ObserveWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (webViewListener != null) {
            webViewListener.onScrollChanged(this, l, t, oldl, oldt);
        }
    }

    public void setWebViewListener(OnWebViewListener webViewListener) {
        this.webViewListener = webViewListener;
    }

    public interface OnWebViewListener {
        void onScrollChanged(ObserveWebView observeWebView, int x, int y, int oldx, int oldy);
    }

}

加载进度条

res/drawable/progress_bar_states.xml :

<?xml version="1.0" encoding="utf-8"?><!-- 层叠 -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="2dp" />

            <gradient
                android:angle="270"
                android:centerColor="#E3E3E3"
                android:endColor="#E6E6E6"
                android:startColor="#C8C8C8" />
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="2dp" />

                <gradient
                    android:centerColor="#4AEA2F"
                    android:endColor="#31CE15"
                    android:startColor="#5FEC46" />
            </shape>
        </clip>
    </item>

</layer-list>

布局:

web_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:gravity="center"
        android:text="显示还是隐藏"
        android:textColor="#ff0000"
        android:textSize="25sp" />

    <ImageView
        android:id="@+id/iv"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:layout_marginBottom="20dp"/>

    <ProgressBar
        android:id="@+id/myProgressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="3dip"
        android:progressDrawable="@drawable/progress_bar_states"
        android:visibility="gone" />

    <com.example.lenovo.mywebtest.ObserveWebView
        android:id="@+id/wv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

测试类:

package com.example.lenovo.mywebtest;

import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.webkit.CookieManager;
import android.webkit.DownloadListener;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MyWebAct extends FragmentActivity {

    private ObserveWebView mWebView;
    private ProgressDialog mProgressDialog;
    private ProgressBar mProgressBar;
    private TextView mTv;
    private ImageView mIv;

    private String url = "http://fu.daicash.cn/active/201709.html";
    //private String url="http://old.daicash.net/app/active/201709.html";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web_layout);

        mProgressBar = ((ProgressBar) this.findViewById(R.id.myProgressBar));
        mWebView = ((ObserveWebView) this.findViewById(R.id.wv));
        mProgressDialog = new ProgressDialog(this);
        mTv = ((TextView) this.findViewById(R.id.tv));
        mIv = ((ImageView) this.findViewById(R.id.iv));

        setScrollBar();//滚动条的设置

        initWebSetting();

        setScrollListener();


        mWebView.loadUrl(url);


        /**
         * 外交使节
         */
        mWebView.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onShowCustomView(View view, CustomViewCallback callback) {
                super.onShowCustomView(view, callback);

            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }

            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                return super.onJsConfirm(view, url, message, result);
            }

            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                return super.onJsPrompt(view, url, message, defaultValue, result);
            }

            @Override
            public void onReceivedIcon(WebView view, Bitmap icon) {
                super.onReceivedIcon(view, icon);

                if (icon != null) {
                    mIv.setImageBitmap(icon);
                    Log.e("MyWebAct", "icon===" + icon);
                }
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);

                if (!TextUtils.isEmpty(title)) {
                    mTv.setText(title);
                    Log.e("MyWebAct", "title===" + title);
                }
            }

            @Override
            public void onProgressChanged(WebView view, int newProgress) {

                //顶部添加进度条
                if (newProgress == 100) {
                    mProgressBar.setVisibility(View.GONE);//加载完网页进度条消失
                } else {
                    if (mProgressBar.getVisibility() == View.GONE) {
                        mProgressBar.setVisibility(View.VISIBLE);
                    }
                    mProgressBar.setProgress(newProgress);//设置进度值
                }

                super.onProgressChanged(view, newProgress);
            }
        });

        /**
         * 内政大臣
         */
        mWebView.setWebViewClient(new WebViewClient() {

            //控制webView是否处理按键时间,如果返回true,则WebView不处理,返回false则处理,默认false
            @Override
            public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
                return super.shouldOverrideKeyEvent(view, event);
            }

            //设置在webView点击打开的新网页在当前界面显示,而不跳转到新的浏览器中
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.trim().startsWith("tel")) {//特殊情况tel,调用系统的拨号
                    Intent i = new Intent(Intent.ACTION_VIEW);
                    i.setData(Uri.parse(url));
                    startActivity(i);
                } else {
                    mWebView.loadUrl(url);
                }

                return true;
            }

            //ViewView的缩放发生改变时调用
            @Override
            public void onScaleChanged(WebView view, float oldScale, float newScale) {
                super.onScaleChanged(view, oldScale, newScale);
            }

            //通知主程序WebView即将加载指定url的资源
            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }

            //通知应用程序内核即将加载url制定的资源,应用程序可以返回本地的资源提供给内核,若本地处理返回数据,内核不从网络上获取数据。
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                return super.shouldInterceptRequest(view, request);
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                mProgressDialog.show();//显示进度圈
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                mProgressDialog.dismiss();//取消进度圈

                //获取webview的cookie
                CookieManager cookieManager = CookieManager.getInstance();
                String CookieStr = cookieManager.getCookie(url);
                Log.e("MyWebAct", "Cookies = " + CookieStr);

            }

            //更新历史记录
            @Override
            public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
                super.doUpdateVisitedHistory(view, url, isReload);
            }

            //当浏览器访问制定的网址发生错误时会通知我们应用程序,比如网络错误。
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                switch (errorCode) {
//                    case HttpStatus.SC_NOT_FOUND:
//                        view.loadUrl("file:///android_assets/error_handle.html");
//                        break;
                }
            }

        });


        //页面的下载设置
        mWebView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {

            }
        });

        //页面的回退设置
        mWebView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK && mWebView != null && mWebView.canGoBack()) {
                    mWebView.goBack();
                    //return true表示这个事件已经被消费,不会再向上传播
                    return true;
                }
                return false;
            }
        });

    }

    private void setScrollListener() {
        mTv.setAlpha(0);
        ViewTreeObserver viewTreeObserver = mTv.getViewTreeObserver();
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @SuppressWarnings("deprecation")
            @Override
            public void onGlobalLayout() {
                mTv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                final int mTitleHeight = mTv.getHeight() + mIv.getHeight();
                Log.e("MyWebAct", "mTv.getHeight()===" + mTv.getHeight());
                Log.e("MyWebAct", "mIv.getHeight()===" + mIv.getHeight());

                mWebView.setWebViewListener(new ObserveWebView.OnWebViewListener() {
                    @Override
                    public void onScrollChanged(ObserveWebView observeWebView, int x, int y, int oldx, int oldy) {
                        //标题随着滚动:显示与隐藏
                        if (y <= 0) {
                            mTv.setAlpha(0);
                        } else if (y > 0 && y <= mTitleHeight) {
                            float scale = (float) y / mTitleHeight;
//                            Log.e("MyWebAct", "===== 透明度scale ===" + scale);

                            mTv.setAlpha(scale);
                        } else {
                            mTv.setAlpha(1);
                        }

                        Log.e("MyWebAct", "===== mWebView.getContentHeight() ===" + mWebView.getContentHeight());
                        Log.e("MyWebAct", "===== mWebView.getScale()===" + mWebView.getScale());
                        Log.e("MyWebAct", "=====  mWebView.getHeight() ===" + mWebView.getHeight());
                        Log.e("MyWebAct", "=====  mWebView.getScrollY() ===" + mWebView.getScrollY());
                        Log.e("MyWebAct", "=====  mWebView.getContentHeight() * mWebView.getScale() ===" + mWebView.getContentHeight() * mWebView.getScale());
                        Log.e("MyWebAct", "=====  转int的  mWebView.getContentHeight() * mWebView.getScale() ===" + (int) (mWebView.getContentHeight() * mWebView.getScale()));
                        Log.e("MyWebAct", "=====  (mWebView.getHeight() + mWebView.getScrollY()===" + (mWebView.getHeight() + mWebView.getScrollY()));
                        Log.e("MyWebAct", "=====  到了底部吗?===" + (mWebView.getContentHeight() * mWebView.getScale() == (mWebView.getHeight() + mWebView.getScrollY())));
                        Log.e("MyWebAct", "=====  转int 到了底部吗?===" + ((int) (mWebView.getContentHeight() * mWebView.getScale()) == (mWebView.getHeight() + mWebView.getScrollY())));
                        //判断到了底部,注意float转int(去掉小数)
                        if ((int) (mWebView.getContentHeight() * mWebView.getScale()) == (mWebView.getHeight() + mWebView.getScrollY())) {
                            Log.e("MyWebAct", "=====  已经到了底部 ===");
                        }

                    }
                });
            }
        });
    }

    private void setScrollBar() {
        // 去掉垂直滚动条
        mWebView.setVerticalScrollBarEnabled(false);//默认false
        // 去掉横向滚动条
        mWebView.setHorizontalScrollBarEnabled(false);//默认false
        // 设置WebView的一些缩放功能点
//        mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);//滚动条在WebView内侧显示
//        mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);//滚动条在WebView外侧显示
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void initWebSetting() {

        WebSettings webSettings = mWebView.getSettings();

         /* ------------------------------JS执行------------------------------ */
         /* ------------------------------JS执行----------------------------- */
        // 允许JS执行
        webSettings.setJavaScriptEnabled(true);
        //支持通过JS打开新窗口
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

         /* ------------------------------//其他细节操作---------------------------- */
         /* ------------------------------//其他细节操作----------------------------- */
        //设置编码格式
        webSettings.setDefaultTextEncodingName("utf-8");
        //http/https混合加载
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }

         /* ------------------------------加快网页加载速度------------------------------ */
         /* ------------------------------加快网页加载速度------------------------------ */
        //noinspection deprecation
        webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);//提高渲染的优先级:默认normal
        //webSettings.setBlockNetworkImage(true);// 把图片加载放在最后来加载渲染


        /* ------------------------------缩放------------------------------ */
        /* ------------------------------缩放------------------------------ */
        //自适应屏幕方式一:不推荐
        //webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);


        //自适应屏幕方式二:
        webSettings.setUseWideViewPort(true);//设定支持viewport
        webSettings.setLoadWithOverviewMode(true);   //自适应屏幕
        webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放,默认false
        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件,默认true


        /* ------------------------------缓存------------------------------ */
        /* ------------------------------缓存------------------------------ */

        //Dom缓存
        webSettings.setDomStorageEnabled(true);//默认false

        //database缓存
        webSettings.setDatabaseEnabled(true);  //默认false

        //APP缓存
        String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
        webSettings.setAppCachePath(appCachePath);//APP缓存路径
        //noinspection deprecation
        webSettings.setAppCacheMaxSize(1024 * 1024 * 10);//APP缓存大小:10M
        webSettings.setAppCacheEnabled(true);//默认false

        //缓存模式
        if (isNetworkAvailable(this)) {
            webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
        } else {
            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        }

        /* ------------------------------访问文件------------------------------ */
        /* ------------------------------访问文件------------------------------ */

        //WebView访问文件数据
        webSettings.setAllowFileAccess(true);//默认true
    }

    //是否有网络
    public boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity == null) {
            return false;
        } else {
            NetworkInfo info = connectivity.getActiveNetworkInfo();
            if (info != null) {
                if (info.getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
        return false;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值