Webview以构造者设计模式封装,快捷使用方式、webview长图
项目gradle
allprojects {
maven { url 'https://jitpack.io' }
}
app.gradle 依赖
implementation 'com.github.SixGL:SixWebView:v1.2.3'
Map map = new HashMap<String, String>();
map.put("gt", "token");
SixWebView builder = new SixWebView.Builder(this).
setWebView(mWebview)
.setSupportJS(true)// 支持js交互
.setIsSupportAddPhoto(true)// 支持webview添加图片
.setUrl(url)
.isWebScreenHot(true)// 支持截取长图
.setUserAgentString("UA_SWeb")// 设置ua
.setWebHead(true, map)// 设置webview的请求头
.setJavaScriptEnabled("haha", new WebJs(this))// 交互协议、交互统一管理类
.setWebChromeClient(new WebChromeClientListener() {
@Override
public void onReceivedTitle(android.webkit.WebView view, String title) {
Log.i(tag, "onReceivedTitle " + title);
}
@Override
public void showFileChooserCallBack(ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
super.showFileChooserCallBack(filePathCallback, fileChooserParams);
Log.i(tag, "showFileChooserCallBack");
/**
* 选择相册还是相机的弹窗由客户端自己定义
* 申请权限等操作由客户端进行环境
* */
}
})
.setWebViewClient(new WebViewClientListener() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageStarted(android.webkit.WebView view, String url, Bitmap favicon) {
Log.i(tag, "onPageStarted = " + url);
}
@Override
public void onPageFinished(android.webkit.WebView view, String url) {
Log.i(tag, "onPageFinishe = " + url);
}
})
.setOnLongClickListener(new OnLongClickListener() {
@Override
public void onLongClick(View view) {
super.onLongClick(view);
Log.i(tag, "onLongClick ");
}
})
.loadUrl();
/**
* 1.如果截取不成功,请在 SixWebView.Builder中设置: isWebScreenHot(true)
* 2.如果只使用webview截长图功能 :请在webview初始化前设置以下代码
* if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
* android.webkit.WebView.enableSlowWholeDocumentDraw();
* }
* webView.setDrawingCacheEnabled(true);
* */
// 具体请看源码里的注释
instance = SWebScreenShot.INSTANCE
.toInit(MainActivity.this, mWebview)
.isScreenSHotLoading(true) // 默认true,提供截图时的loading
.setDelayTime(300)// 截取长图延迟时间 (需要延迟原因:请看源码注释)如果存在截取的图不完整情况,可以尝试调整一下延迟截取时间
.isReloadWeb(true)// webview重载
.toScreenSHot()// webview 截取前准备(测量宽高)
.toCancvas(new ScreenShotCallback() {// 截取回调
@Override
public void screenShotResult(String path) {
Log.e("SixWeb", "screenShotResult " + path);
}
@Override
public void screenShotBefore() {
super.screenShotBefore();
// 使用自定义loading,需要把设置:isScreenSHotLoading(false)
// 截取开始前的回调 开发者可自定义展示loading
Log.e("SixWeb", "screenShotBefore ");
}
@Override
public void screenShotafter() {
super.screenShotafter();
// 截取结束后的回调 开发者关闭自定义loading
Log.e("SixWeb", "screenShotafter ");
}
});
注意:一定在当前界面销毁时调用。
@Override
protected void onDestroy() {
super.onDestroy();
if (instance != null) {
instance.recycle();
}
}
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
public class WebJs extends JSInteraction {
//客户端与js交互的方式 卸载这里
public WebJs(Context context) {
super(context);
}
经测试:1、目前正常h5适用移动端的网页是可以截图的
2、如果有截取问题的仔细看上述适用规则
3、pc端的网页目前,因为没有适配app端,刚打开不滑动的情况下截图是没有问题的.
滑动后,截取的是当前屏幕可见的网页内容。这个问题目前还在寻找解决方案。