creator截屏儲存到手機相冊功能
流程:點選按鈕——截屏——儲存圖檔到相冊
1、js部分:
截圖代碼:
/**
* @name: 截屏并儲存圖檔
* @param {cc.Node} 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部分 :
建立一個SaveImgModule.java檔案,放在proj.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 Ryan.Tang
*
*/
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(this.node);方法即可。