8***@qq.com
8***@qq.com
  • 发布:2020-08-11 11:05
  • 更新:2020-10-16 09:57
  • 阅读:1136

【报Bug】Android版 Webview窗口使用WKWebview内核时截屏绘制(draw)设置 WebviewDrawOptions 的 clip 参数无效的Bug

分类:HTML5+

产品分类: HTML5+

HBuilderX版本号: 2.8.4

手机系统: Android

手机系统版本号: Android 9.0

手机厂商: 小米

手机机型: 小米,锤子均测试过

打包方式: 离线

示例代码:

var clipregin = {
top: top + 'px',
left: left + 'px',
width: width + 'px',
height: height + 'px'
};
console.log('clipregin:' + JSON.stringify(clipregin));

var bitmap = new plus.nativeObj.Bitmap('bitmap');
var ws = plus.webview.currentWebview();
ws.draw(bitmap, function() {
console.log('截屏绘制图片成功');
bitmap.clear();
}, function(e) {
bitmap.clear();
console.log('截屏绘制图片失败:' + JSON.stringify(e));
}, {
clip: {
top: top + 'px',
left: left + 'px',
width: width + 'px',
height: height + 'px'
}
});

操作步骤:

IOS的clip参数有效,Android的不行,只能截全屏
去掉clip参数可以截全屏,但不是想要的。

预期结果:

IOS的clip参数有效,Android的不行,只能截全屏
去掉clip参数可以截全屏,但不是想要的。

实际结果:

IOS的clip参数有效,Android的不行,只能截全屏
去掉clip参数可以截全屏,但不是想要的。

bug描述:

Android端,webview 的 draw 方法 WebviewDrawOptions 参数 设置clip区域无效

IOS的clip参数有效,Android的不行,只能不设置clip截全屏
去掉clip参数可以截全屏,但不是想要的。

--- log ---

  • clipregin:{"top":"52.20px","left":"173.60px","width":"163.59px","height":"255.60px"}
  • 截屏绘制图片失败:{"code":-100,"message":"截图失败"}
2020-08-11 11:05 负责人:无 分享
已邀请:
百倍

百倍

Android机型,截图正常
iOS机型,bitmap.save时,clip的top参数无效,但在plus.webview.currentWebview().draw时,是有效的。
源码示例 https://blog.csdn.net/qq285679784/article/details/109001187

<!DOCTYPE html>  
<html>  
    <head>  
        <meta charset="utf-8">  
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
        <title></title>  
        <link href="css/mui.min.css" rel="stylesheet" />  
    </head>  
    <body>  
        <div>  
            <img src="http://p1.bqimg.com/567571/cedca293f269ba11.jpg" width="100%" />  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
            <p>dddd</p>  
        </div>  
        <script src="js/mui.min.js"></script>  
        <script src="js/drawScreen.js"></script>  
        <script type="text/javascript" charset="utf-8">  
            mui.init();  
            mui.plusReady(function() {  

                // 截屏图片比例 5:4  
                let descWidth = document.body.clientWidth;  
                let descHeight = descWidth / (5 / 4);  

                var options = {  
                    successCB: function(e) {  
                        console.log(JSON.stringify(e))  
                    },  
                    errorCB: function(e) {  
                        console.log(JSON.stringify(e))  
                    },  
                    quality: 80,  
                    clip: {  
                        top: '20px',  
                        left: '0px',  
                        width: descWidth,  
                        height: descHeight  
                    }  
                }  

                drawScreen(options);  
            });  
        </script>  
    </body>  
</html>  

/*     drawScreen.js  
    参数说明:  
    参数名     类型         说明                               默认值         是否必选  
    successCB |  Function  | 成功回调函数                 |               |   Y  
    errorCB   |  Function  | 失败,回调函数                    |   Function    |     
    fileName  |  String    | 文件名,不需后缀名              |   当前时间戳   |     
    imgID     |  String    | 原生图片ID                     |   当前时间戳   |     
    overwrite |  Boolean   | 是否覆盖                       |   true        |     
    format    |  String    | 保存的格式                      |   PNG         |     
    quality   |  Number    | 保存质量,1-100,1最低,100最高   |   50          |     
    clip      |  Object    | 指定截屏区域                 |   {top:’0px’,left:’0px’,width:’100%’,height:’100%’}     
*/  

var drawScreen = function(options) {  
    options = {  
        successCB: options.successCB || function() {},  
        errorCB: options.errorCB || function() {},  
        fileName: options.fileName || Date.parse(new Date()),  
        imgID: options.imgID || String(Date.parse(new Date())),  
        overwrite: options.overwrite || true,  
        format: options.format || 'jpg',  
        quality: options.quality || 50,  
        clip: options.clip || {  
            top: '0px',  
            left: '0px',  
            width: '100%',  
            height: '100%'  
        }  
    }  
    var self = plus.webview.currentWebview();  
    var bitmap = new plus.nativeObj.Bitmap(options.imgID);  

    //绘制截图  
    self.draw(bitmap, function() {  
        // 保存Bitmap图片  
        bitmap.save('_doc/' + options.fileName + '.' + options.format, {  
            overwrite: options.overwrite,  
            format: options.format,  
            quality: options.quality,  
            clip: options.clip  //iOS机型,bitmap.save时,clip的top参数无效,但在self.draw时,是有效的。  
        }, function(i) {  
            //销毁Bitmap图片  
            bitmap.clear();  
            options.successCB({  
                success: 'success',  
                details: i.target  
            });  
        }, function(e) {  
            bitmap.clear();  
            options.errorCB({  
                error: '图片保存失败',  
                details: e  
            });  
        });  

    }, function(e) {  
        options.errorCB({  
            error: '截屏绘制失败',  
            details: e  
        });  
    },{  
        clip: options.clip //绘制截图时,设置clip,解决iOS机型下clip-top无效bug  
    });  
}

该问题目前已经被锁定, 无法添加新回复