-
Creator 版本:
2.4.12 -
目标平台:鸿蒙3.0,手机是honor8,夜神模拟器也一样无法使用
下面这个是代码复现工程:
NewProject_screenshot.zip (241.2 KB) -
重现方式:运行就会直接黑屏
-
首个报错:
-
之前哪个版本是正常的: 2.4.9
-
手机型号: 鸿蒙3.0,手机是honor8
-
手机浏览器:
-
编辑器操作系统:
-
重现概率:2.4.9之前不会,升级引擎后就用不了了
以下是截图的代码,此代码在2.4.9可以正常使用,升级引擎后就无法使用了
start() {
this.scheduleOnce(() => {
this.screenshot((spriteFrame) => {
var canvas = cc.director.getScene().getChildByName('Canvas'),
node = new cc.Node();
node.parent = canvas;
node.zIndex = 1000;
node.scale = 0.8;
var sprite = node.addComponent(cc.Sprite);
sprite.spriteFrame = spriteFrame;
// next(spriteFrame);
});
}, 1)
},
screenshot(next) {
console.log("进入截图流程!!!!!!!!!!!",)
var canvas = cc.director.getScene().getChildByName('Canvas'),
node = new cc.Node();
node.parent = canvas;
var camera = node.addComponent(cc.Camera);
camera.backgroundColor = cc.Color.TRANSPARENT;
camera.clearFlags = cc.Camera.ClearFlags.DEPTH | cc.Camera.ClearFlags.STENCIL | cc.Camera.ClearFlags.COLOR;
var renderTexture = new cc.RenderTexture();
renderTexture.initWithSize(cc.visibleRect.width * 0.5, cc.visibleRect.height * 0.5, cc.game._renderContext.STENCIL_INDEX8);
camera.targetTexture = renderTexture;
var spriteFrame = new cc.SpriteFrame();
if (cc.sys.isNative) {
console.log("是安卓截图!!!!!!!!!!!!!")
camera.enabled = true;
camera.scheduleOnce(() => {
console.log("------------计时结束-----------------",)
var data = renderTexture.readPixels();
var width = renderTexture.width;
var height = renderTexture.height;
var picData = new Uint8Array(width * height * 4);
var rowBytes = width * 4;
console.log("------------data-----------------")
for (var row = 0; row < height; row++) {
var srow = height - 1 - row;
var start = srow * width * 4;
var reStart = row * width * 4;
for (var i = 0; i < rowBytes; i++) {// save the piexls data
picData[reStart + i] = data[start + i];
}
}
console.log("------------开始创建Texture2D----------------")
var texture = new cc.Texture2D();
console.log("--Texture2D创建成功-----------截图:创建纹理!!!!!!!!!!!");
texture.initWithData(picData, 32, width, height);
spriteFrame.setTexture(texture);
next(spriteFrame);
camera.targetTexture = null;
camera.enabled = false;
node.destroy();
}, 0);
} else {
camera.enabled = false;
// 执行一次 render,将所渲染的内容渲染到纹理上
camera.render();// 到这里,截图就已经完成了
// 接下去,可以从 RenderTexture 中获取数据,进行深加工
var data = renderTexture.readPixels();
var width = renderTexture.width;
var height = renderTexture.height;
// 接下来就可以对这些数据进行操作了
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width = width;
canvas.height = height;
// 1维数组转2维(同时做个上下翻转)
var rowBytes = width * 4;
for (var row = 0; row < height; row++) {
var srow = height - 1 - row;
var imageData = ctx.createImageData(width, 1);
var start = srow * width * 4;
for (var i = 0; i < rowBytes; i++) {
imageData.data[i] = data[start + i];
}
ctx.putImageData(imageData, 0, row);
}
var dataUrl = canvas.toDataURL("image/jpeg");
var img = new Image();
img.src = dataUrl;
img.onload = function () {
var texture = new cc.Texture2D();
texture.initWithElement(img);
texture.handleLoadedTexture();
spriteFrame = new cc.SpriteFrame(texture);
next(spriteFrame);
}
}
}
截图在真机上一运行就黑屏了。
截图后调用render了。逻辑延时一帧也有,但是就是用不了
不知道是不是安卓新版本的sdk不兼容低版本?