creator截屏保存到手机相册功能
流程:点击按钮——截屏——保存图片到相册
1、js部分:
截图代码:
/**
* @name: 截屏并保存图片
* @param {} parentNode: 当前节点
*/
saveScreen (parentNode) {
let node = new cc.Node();
node.parent = parentNode;
let cam = node.addComponent(cc.Camera);
// 设置你想要的截图内容的 cullingMask
cam.cullingMask = 0xffffffff;
// 新建一个 RenderTexture,并且设置 camera 的 targetTexture 为新建的 RenderTexture,这样camera的内容将会渲染到新建的 RenderTexture 中。
let texture = new cc.RenderTexture();
this.texture = texture ;
let gl = cc.game._renderContext;
// 如果截图内容中不包含 Mask 组件,可以不用传递第三个参数
texture.initWithSize(cc.visibleRect.width, cc.visibleRect.height, gl.STENCIL_INDEX8);
cam.targetTexture = texture;
// 渲染一次摄像机,即更新一次内容到 RenderTexture 中
cam.render();
// 这样我们就能从 RenderTexture 中获取到数据了
let data = texture.readPixels();
let w = texture.width;
let h = texture.height;
let fileName = 'render_to_sprite_image.png';
if (CC_JSB) { //原生平台
//翻转图片
let picData = new Uint8Array(w * h * 4);
let rowBytes = w * 4;
for (let row = 0; row < h; row++) {
let srow = h - 1 - row;
let start = srow * w * 4;
let reStart = row * w * 4;
// save the piexls data
for (let i = 0; i < rowBytes; i++) {
picData[reStart + i] = data[start + i];
}
}
let path = jsb.fileUtils.getWritablePath() + fileName;
let success = jsb.saveImageData(picData, w, h, path)
if (success) {
let args = {};
args["path"] = path;
args["filename"] = fileName;
let json = JSON.stringify(args);
let fun = function(str){
if(str){
let actCallback = function(){
GameCache.hall.appendTip("截图已保存到相册");
}
this.captureAction(picData, w, h, actCallback)
}
};
if(cc.sys.os == cc.sys.OS_ANDROID){
return jsb.reflection.callStaticMethod("com/rx/market/core/SaveImgModule",
"requestChannel",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
json, fun);
}
else if(cc.sys.os == cc.sys.OS_IOS){
//暂时只做了android的
}
}
else{
//提示截图失败
}
}
else{
if (!this._canvas) {
this._canvas = document.createElement('canvas');
this._canvas.width = w;
this._canvas.height = h;
}
let ctx = this._canvas.getContext('2d');
cam.render();
let picData = texture.readPixels();
// write the render data
let rowBytes = w * 4;
for (let row = 0; row < h; row++) {
let srow = h - 1 - row;
let imageData = ctx.createImageData(w, 1);
let start = srow * w * 4;
for (let i = 0; i < rowBytes; i++) {
imageData.data[i] = picData[start + i];
}
ctx.putImageData(imageData, 0, row);
}
//保存图片
let dataImg = this._canvas.toDataURL("image/png");
let save_link = document.createElement('a');
save_link.href = dataImg;
save_link.download = fileName;
let event = document.createEvent('MouseEvents');
event.initEvent("click", true, false);
save_link.dispatchEvent(event);
GameCache.hall.appendTip("截图已保存");
}
},
截屏动画代码:
/**
* @name: 播一个截屏动画
* @param {Array} picData:Uint8Array图像数据
* @param {Number} width: 宽
* @param {Number} height: 高
* @param {Function} actCallback: 回调
*/
captureAction(picData, width, height, actCallback) {
let texture = new cc.Texture2D();
texture.initWithData(picData, cc.Texture2D.RGBA8888, width, height);
let spriteFrame = new cc.SpriteFrame();
spriteFrame.setTexture(texture);
let tempNode = new cc.Node();
let sprite = tempNode.addComponent(cc.Sprite);
sprite.spriteFrame = spriteFrame;
tempNode.zIndex = cc.macro.MAX_ZINDEX;
tempNode.parent = cc.director.getScene();
tempNode.x = cc.winSize.width / 2;
tempNode.y = cc.winSize.height / 2;
let scaleAction = cc.scaleTo(0.5, 0.2);
let targetPos = cc.v2(tempNode.width*0.2/2 + 20, tempNode.height*0.2/2 + 20);
let moveAction = cc.moveTo(0.5, targetPos);
let spawn = cc.spawn(scaleAction, moveAction);
let finished = cc.callFunc(() => {
tempNode.destroy();
if(actCallback){
actCallback();
}
})
let action = cc.sequence(spawn, cc.delayTime(0.3), finished);
tempNode.runAction(action);
},
2、android部分 :
创建一个文件,放在-studio\src\com\rx\market\core
目录下
代码如下:
package com.rx.market.core;
import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log;
import com.rx.market.base.Method;
import com.rx.market.base.Module;
import com.rx.market.export.ChannelExport;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.FileNotFoundException;
/**
* Tools for handler picture
*
* @author
*
*/
public final class SaveImgModule extends Module {
private static SaveImgModule _saveImgModule = null;
public static SaveImgModule getInstance() {
if (_saveImgModule == null) {
synchronized (SaveImgModule.class) {
if (_saveImgModule == null) {
_saveImgModule = new SaveImgModule();
}
}
}
return _saveImgModule;
}
public SaveImgModule() {
super("saveImgModule");
Register("saveImgToSystemGallery",new saveImgToSystemGallery());
}
public class saveImgToSystemGallery implements Method {
//保存图片到系统相册
@Override
public String Execute(String args, String callBack) {
String bRes = "save fail!!!";
JSONObject json;
// 文件插入系统图库
try
{
json = new JSONObject(args);
String path = json.getString("path");
String filename = json.getString("filename");
MediaStore.Images.Media.insertImage(activity.getContentResolver(), path, filename, null);
// 最后通知图库更新
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
bRes = "save success!!!";
if(callBack != "") {
ChannelExport.getInstance().executeAyncMethod(callBack, "save success");
}
}
catch (FileNotFoundException | JSONException e)
{
e.printStackTrace();
}
return bRes;
}
}
}
最后加一个按钮,点击调用saveScreen();方法即可。