天天看點

安卓使用webview一鍵截長圖寬圖安卓使用webView一鍵截長圖寬圖

安卓使用webView一鍵截長圖寬圖

項目中webView要截圖,但是不同手機又不能滿足截圖需要,

增加一個 “截圖” 功能! 可以截取 超出螢幕的長圖和寬圖

效果圖

安卓使用webview一鍵截長圖寬圖安卓使用webView一鍵截長圖寬圖
  • honor 6x的橫屏的下不支援截長圖 (原表格内容是可上下左右滑動的)
安卓使用webview一鍵截長圖寬圖安卓使用webView一鍵截長圖寬圖
  • 點選上圖"一鍵截圖" 截到的圖
安卓使用webview一鍵截長圖寬圖安卓使用webView一鍵截長圖寬圖
  • 截圖後分享到微信(以上貼圖是壓縮後的效果,原圖是比較清晰的)

WebActivity

...
var webSettings = webView!!.settings
            webSettings.userAgentString = WebUI.UA
            webSettings.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN
            webSettings.javaScriptEnabled = true
            webSettings.domStorageEnabled = true
            webSettings.builtInZoomControls = true
            webSettings.setSupportZoom(true)
            webSettings.loadWithOverviewMode = true
            webSettings.displayZoomControls = false;
            webView.setOnLongClickListener { true }
webView!!.webChromeClient = object : WebChromeClient() {
    override fun onProgressChanged(view: WebView, newProgress: Int) {
        ...
    }
    
    override fun onJsAlert(view: WebView?, url: String?, message: String?, result: JsResult?): Boolean {
        result?.confirm()
        return true
    }
    
    override fun onJsPrompt(webView: WebView, url1: String, message: String, defaultValue: String, result: JsPromptResult): Boolean {
        "capture" -> {
            //從接收到webview的寬高參數
            var width = obj.getString("width").toFloat()
            var height = obj.getString("height").toFloat()
            captureWholePage(SysUtil.px2dp(this@WebUI, width),SysUtil.px2dp(this@WebUI, height))
                      }
    }
    
}


/**
  * 截圖
  */
private fun captureWholePage(width: Int, height: Int) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        try {
            var bitmap = captureWebViewLollipop(webView, width, height)
            //4.4的截圖方法測試過,高版本也可以使用但是已經被标為廢棄不推薦了
            //var bitmap = captureWebViewKitKat(webView)
            if (bitmap != null) {
                shareCapture(bitmap)
            } else {
                SmartToast.showInCenter("生成圖檔出錯")
            }
        } catch (oom: OutOfMemoryError) {
            SmartToast.showInCenter("OutOfMemoryError")
        }

    } else {
        SmartToast.showInCenter("目前手機版本過低,不支援截圖功能")
    }

}

/**
  * 5.0以上截長圖
  */
private fun captureWebViewLollipop(webView: WebView, height: Int): Bitmap {
    webView.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    webView.layout(0, 0, webView.measuredWidth, height)
    webView.isDrawingCacheEnabled = true;
    webView.buildDrawingCache()
    var longImage = Bitmap.createBitmap(webView.measuredWidth, webView.measuredHeight, Bitmap.Config.ARGB_8888)
    var canvas = Canvas(longImage)
    webView.draw(canvas)
    return longImage
}

/**
  * 截圖 4.4
  */
private fun captureWebViewKitKat(webView: WebView): Bitmap? {
        //擷取Picture對象
        var picture = webView.capturePicture()
        //得到圖檔的寬和高(沒有reflect圖檔内容)
        var width = picture.width
        var height = picture.height
        if (width > 0 && height > 0) {
            //建立位圖
            var bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            var canvas = Canvas(bitmap)
            //繪制(會調用native方法,完成圖形繪制)
            picture.draw(canvas)
            return bitmap
        }
        return null
    }


/**
  * 分享到微信,使用第三方shareSDk
  */
private fun shareCapture(bitmap: Bitmap) {
        var uri = Uri.parse(MediaStore.Images.Media.insertImage(contentResolver, bitmap, null, null));
        val imgPath= getRealFilePath(this,uri)
//        系統的分享到微信會壓縮導緻檢視圖檔不能顯示"檢視原圖"
//        var intent = Intent(Intent.ACTION_SEND)
//        intent.type = "image/jpeg"
//        intent.putExtra(Intent.EXTRA_STREAM, uri)
//        startActivity(Intent.createChooser(intent, "分享"));

        var oks = OnekeyShare();
        oks.disableSSOWhenAuthorize();
        oks.setImagePath(imgPath)
        oks.show(this)
    
}

/**
  * 根據Uri擷取真實圖檔路徑
  *
  *
  * 一個android檔案的Uri位址一般如下:
  * content://media/external/images/media/62026
  *
  * @param context
  * @param uri
  * @return
  */
fun getRealFilePath(context: Context, uri: Uri?): String? {
    if (null == uri) return null
    val scheme = uri!!.scheme
    var data: String? = null
    if (scheme == null)
    data = uri!!.path
    else if (ContentResolver.SCHEME_FILE == scheme) {
        data = uri!!.path
    } else if (ContentResolver.SCHEME_CONTENT == scheme) {
        val cursor = context.contentResolver.query(uri, arrayOf(MediaStore.Images.ImageColumns.DATA), null, null, null)
        if (null != cursor) {
            if (cursor!!.moveToFirst()) {
                val index = cursor!!.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
                if (index > -1) {
                    data = cursor!!.getString(index)
                }
            }
            cursor!!.close()
        }
    }
    return data
}
    
    
           

Web頁面

預設加載的

meta

增加一個方法改造成擷取

initial-scale

<script>
   ;(function () {
    //這裡頁面内容的寬度為960px
    var scale = (screen.width / 960).toFixed(2);
    document.write('<meta name="viewport" content="width=device-width, initial-scale=' + scale + ', maximum-scale=1, user-scalable=no>')
})();
</script>
           
  • 根據自己頁面内容的寬度調整被除數, 截圖出來的寬度就是占滿的