安卓使用webView一键截长图宽图

项目中webView要截图,但是不同手机又不能满足截图需要,

增加一个 “截图” 功能! 可以截取 超出屏幕的长图宽图

效果图

  • honor 6x的横屏的下不支持截长图 (原表格内容是可上下左右滑动的)

  • 点击上图"一键截图" 截到的图

  • 截图后分享到微信(以上贴图是压缩后的效果,原图是比较清晰的)

WebActivity

...
var webSettings = webView!!.settingswebSettings.userAgentString = WebUI.UAwebSettings.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMNwebSettings.javaScriptEnabled = truewebSettings.domStorageEnabled = truewebSettings.builtInZoomControls = truewebSettings.setSupportZoom(true)webSettings.loadWithOverviewMode = truewebSettings.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.widthvar height = picture.heightif (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 nullval scheme = uri!!.schemevar data: String? = nullif (scheme == null)data = uri!!.pathelse 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

<meta name="viewport" content="width=device-width, initial-scale=1">

增加一个方法改造成获取 initial-scale

<script>;(function () {//这里页面内容的宽度为960pxvar 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>
  • 根据自己页面内容的宽度调整被除数, 截图出来的宽度就是占满的

安卓使用webview一键截长图宽图相关推荐

  1. android中最新webview的功能,Android WebView实现截长图功能

    本文实例为大家分享了Android实现截长图功能的具体代码,供大家参考,具体内容如下 先看看手机自带的长截屏功能:  机型: vivo x9 plus 大胆推测实现逻辑: 1:需要一个可以滚动的Vie ...

  2. android webview 图片居中,Android WebView实现截长图功能

    本文实例为大家分享了Android实现截长图功能的具体代码,供大家参考,具体内容如下 先看看手机自带的长截屏功能:  机型: vivo x9 plus 大胆推测实现逻辑: 1:需要一个可以滚动的Vie ...

  3. Android 实现截屏和截长图功能的几种方法

    欢迎大家关注我的公众号:**牛角尖尖上起舞** 一般情况下各种型号的手机都会有自带的截屏功能,也会有诸如"开关机键+音量键"的截屏快捷键,只要手机是亮屏状态,都会将手机屏幕的可视区 ...

  4. WebView截长图解决方案

    作者:Windin 贝聊移动Android工程师 链接: http://www.jianshu.com/p/0faa70e88441 前言:本文主要讲述了以下两个方面: 1. 普通WebView如何截 ...

  5. microsoft edge怎么截长图_苹果安卓手机怎么截长图?超简单的方法拿走不谢

    操作方便才是硬道理 ▣编辑:瓜酱 来源:网络 一.小米手机 1. 第一步,打开手机,向下滑动打开通知栏,找到截图工具图标. 2. 第二步,如果在前四个图标内没有截屏图标的话,就点击展开所有的功能,可通 ...

  6. android WebView截长图实现

    1.先简单介绍下webview截屏,看代码: //开启缓存 webview.setDrawingCacheEnabled(true); webview.buildDrawingCache();Bitm ...

  7. Android实现截屏和截长图功能的几种方法

    一般情况下各种型号的手机都会有自带的截屏功能,也会有诸如"开关机键+音量键"的截屏快捷键,只要手机是亮屏状态,都会将手机屏幕的可视区域(包含状态栏)全部截取下来. 如果开发中想要调 ...

  8. Android滚动截屏,ScrollView截屏,Listview截屏,Recyclerview截屏, 截长图

    最近在做一个关于截频的功能, 恰逢鸿洋大神分享了一篇相关的博客, 我使用之后觉得甚是好用, 所以也整理了一下,以供学习. 在做分享功能的时候,需要截取全屏内容还有截长图,一屏展示不完的内容,一般我们会 ...

  9. microsoft edge怎么截长图_苹果手机怎么截长图?(2020年最新版)

    苹果手机怎么截长图?苹果手机没有自带截长图功能?想要截长图不知道怎么操作?我相信大部分人是不知道用苹果手机怎么截长图的,作为一个搞机多年的小编,今天就教一下大家苹果手机怎么截长图. 很多人都羡慕安卓手 ...

最新文章

  1. Monkey原理初步和改良优化--Android自动化测试学习历程
  2. 转 Python爬虫入门二之爬虫基础了解
  3. linux文件管理系统开发毕业,定稿毕业论文基于Linux的远程管理系统服务器端的实现word文档(范文1)...
  4. linux下python版本升级,linux下升级python版本
  5. [bbk4343]小布-OCP 042全真试题讲解
  6. Python ID 生成(UUID、自增、19位雪花算法ID)
  7. 【白皮书分享】2021年智慧城市白皮书:依托智慧服务,共创新型智慧城市.pdf(附下载链接)
  8. linux初识到入门_系统
  9. 安卓手机上最好用的3个azw3阅读器
  10. 哈希表、哈希桶数据结构以及刨析HashMap源码中哈希桶的使用
  11. 软件需求跟踪矩阵例子
  12. OpenCV——常用函数
  13. 详解几个基本概念“标准差标准误差,方差均方差”
  14. CORS Missing Allow Origin
  15. 互联网应用的两种工作模式:客户/服务器模式与P2P模式
  16. 负载均衡设备oracle,高可用的Oracle数据库负载均衡技术--深信服AD系列应用交付平台...
  17. GO分析和KEGG分析都是啥?
  18. 计算机 无法进入睡眠模式,win10电脑无法进入睡眠模式怎么解决
  19. ABAP Docking Control Container开发实例
  20. python应用-scipy,numpy,sympy计算微积分

热门文章

  1. 微波炉怎么用(微波炉是如何加热食物的?)
  2. 计算机毕业设计Java计算机类在线学习管理系统(源码+系统+mysql数据库+lw文档)
  3. 2018狗年宝宝取名技巧总结,快来看看吧!
  4. 【安卓】Android Studio 无法识别手机解决办法
  5. 原生JS实现vue中data值的修改与渲染
  6. 漫画 | 干掉session,爽死了!
  7. Unity之OpenXR+XR Interaction Toolkit实现 传送
  8. CP2102 USB to UART Bridge Driver的安装 RF读写器连接电脑不成功
  9. NBA表格_爬取NBA球员薪资数据【Python数据分析百例连载】
  10. html我的世界代码大全,我的世界作弊码大全 MC当中所有的指令总汇