Cocos2dx GL SurfaceView截屏 应用层实现

Cocos2d-x程序在Android下的启动过程 本文通过分析cocos2d-x自身提供的示例程序HelloLua来分析cocos2d-x程序在android平台下的具体启动过程。 阅读详情

Cocos2dx GL SurfaceView截屏  应用层实现

环境:使用Cocosdx进行游戏开发,需要Android实现截屏分享功能,但JNI没有提供截图路径,所以需要Android应用层实现截屏功能


1.使用Activity的截屏方法

public class ScreenShot {  
  
	public static Bitmap takeScreenShot(Activity activity) {  
        // View是你需要截图的View  
        View view = activity.getWindow().getDecorView();  
        view.setDrawingCacheEnabled(true);  
        view.buildDrawingCache();  
        Bitmap b1 = view.getDrawingCache();  
  
        // 获取状态栏高度  
        Rect frame = new Rect();  
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);  
        int statusBarHeight = frame.top;  
  
        // 获取屏幕长和高  
        int width = activity.getWindowManager().getDefaultDisplay().getWidth();  
        int height = activity.getWindowManager().getDefaultDisplay()  
                .getHeight();  
        // 去掉标题栏  
        Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height  
                - statusBarHeight);  
        view.destroyDrawingCache();  
        return b;  
    }  
  
    private static void savePic(Bitmap b, File filePath) {  
        FileOutputStream fos = null;  
        try {  
            fos = new FileOutputStream(filePath);  
            if (null != fos) {  
                b.compress(Bitmap.CompressFormat.PNG, 100, fos);  
                fos.flush();  
                fos.close();  
            }  
        } catch (FileNotFoundException e) {  
            // e.printStackTrace();  
        } catch (IOException e) {  
            // e.printStackTrace();  
        }  
    }  
  
    public static void shoot(Activity a, File filePath) {  
        if (filePath == null) {  
            return;  
        }  
        if (!filePath.getParentFile().exists()) {  
            filePath.getParentFile().mkdirs();  
        }  
        ScreenShot.savePic(ScreenShot.takeScreenShot(a), filePath);  
    }  
}  


问题:截屏为黑屏。

原因:因为Activity和SurfaceView的页面绘制机制是不用的



2.使用surfaceView的截屏方法

Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
draw(canvas);

问题:截屏为白屏。

原因:因为cocos2dx项目,绘图是由CPP代码执行的,在Cocos2dxGLSurfaceView上绘图,所以不能使用一般SurfaceView的截图方法。


3.应用层。使用org.cocos2dx.lib中的Cocos2dxRenderer类中的GL10转为Bitmap


新建截屏类ShotScreenByGL10 ,将GL10转换为Bitmap

public class ShotScreenByGL10 {
	
	private static int width;
	private static int height;
	public static  GL10 gl;
	
	public static void setWidth(int width) {
		ShotScreenByGL10.width = width;
	}

	public static void setHeight(int height) {
		ShotScreenByGL10.height = height;
	}

	public static void setGl(GL10 gl) {
		ShotScreenByGL10.gl = gl;
	}

	public static Bitmap getShotScreenBitmap() {
		
		ByteBuffer buffer = ByteBuffer.allocateDirect(width * height * 4);
        gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, buffer);
 
        // 上下逆なので、上下反転
        byte[] tmp1 = new byte[width * 4];
        byte[] tmp2 = new byte[width * 4];
        int h = (int) height / 2;
        for (int y = 0; y < h; y++) {
            buffer.position(y * width * 4);
            buffer.get(tmp1, 0, tmp1.length);
            buffer.position((height - 1 - y) * width * 4);
            buffer.get(tmp2, 0, tmp2.length);
            buffer.position((height - 1 - y) * width * 4);
            buffer.put(tmp1);
            buffer.position(y * width * 4);
            buffer.put(tmp2);
        }
        buffer.position(0);
        tmp1 = tmp2 = null;
 
        // Bitmapの作成
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.copyPixelsFromBuffer(buffer);
 
        // 後片付け
        buffer = null;
        System.gc();

		
		return bitmap;
	}

}

在org.cocos2dx.lib中的Cocos2dxRenderer类中的onDrawFrame()方法中添加

ShotScreenByGL10.setGl(gl);
即对底层每一帧绘画的最新GL10进行保存,以便需要截屏时,将GL10转换成Bitmap


这样就能随时获取到最新的绘画GL10,然后将其转化为Bitmap,从而获取到截屏图片。


成功!!!

4.JNI层。在JNI层调用cocos2dx的截屏功能,将屏幕截取并保存到路径Path中,再将Path传递给JAVA应用层代码,最后在JAVA应用层根据Path获取图片,实现截屏分享功能。

但这样需要JNI那边进行截好图,供应用层调用

一般实现方法。


cocos2d-x二维码控件 基于libqrencode实现的显示二维码的控件,使用DrawNode绘制显示区。 立即下载

相关推荐

AI量化投资开源平台——Qlib(微矿)的学习使用笔记(随缘更新)

Qlib 涵盖了量化投资的全过程,为用户的 AI 算法提供了高性能的底层基础架构,从框架设计上让用户可以更容易地应用 AI 算法来辅助解决量化投资的各个关键问题(例如 Alpha 预测,风险预测,市场动态性建模)。本文旨在记录一些面向初学者的基础内容。

in_void的博客 3133

Cocos2d-x java 通过jni调用c++的方法

前面博客说到,cocos2d-x c++界面层运行在一个GLThread线程里面,严格的说是运行在Cocos2dxGLSurfaceView(继承自GLSurfaceView) 里面。opengl的渲染,刷新都是有这个类来完成。 所以我们不能直接在java方法里调用c++方法来刷新界面,唯一的方法就是绕开javaUI主线程,让GLSurfaceView来做这件工作。 ok,前面说到...

weixin_30699465的博客 214

Isaac Sim 6 利用Replicator实现高效语义分割与实例分割(实践指南5.10)

本文详细介绍了如何利用Isaac Sim 6的Replicator工具高效生成语义分割和实例分割数据集。通过虚拟环境自动标注,效率提升20倍以上,特别适用于农业机器人等计算机视觉项目。文章包含环境配置、场景构建、批量标注技巧及实例分割处理等实战指南,帮助开发者快速掌握合成数据生成技术。

weixin_42526415的博客 266

cocos2dx android平台事件系统解析

对于cocos2dx在android平台事件的响应过程很模糊,于是分析了下源码,cocos2dx 版本3.4,先导入一个android工程,然后看下AndroidManifest.xml &lt;application android:label="@string/app_name" android:icon="@drawable/icon"&gt...

linuxheik的专栏 415

zabbix添加IBM服务器SNMPV3监控

本地采用欧冠的是zabbix5.0,服务器型号是SR860,使用snmpv3因为只支持这个,醉了。说明:本地采用欧冠的是zabbix5.0,服务器型号是SR860。

萌新包大人的博客 1985

IO多路转接 ——— select、poll、epoll

select是系统提供的一个多路转接接口。select函数的函数原型如下: 参数说明:参数timeout的取值:返回值说明:select调用失败时,错误码可能被设置为:fd_set结构与sigset_t结构类似,fd_set本质也是一个位图,用位图中对应的位来表示要监视的文件描述符。 调用select函数之前就需要用fd_set结构定义出对应的文件描述符集,然后将需要监视的文件描述符添加到文件描述符集当中,这个添加的过程本质就是在进行位操作,但是这个位操作不需要用户自己进行,系统提供了一组专门的接口,用

2021dragon的博客 7979

cocos2d-x游戏开发(四)游戏主循环

欢迎转载:http://blog.youkuaiyun.com/fylz1125/article/details/8518737 终于抽时间把这个游戏写完了。由于没有自拍神器,所以把它移植到了Android上,用我的戴妃跑的很欢啊。自此,我算是完成了一个功能比较完善的游戏了。 麻雀虽小,五脏俱全,该有的都有,不该有的估计也有,嘿嘿。这几天把写这个游戏的经历和学习过程整理一下,多写几篇博客,就当做记笔记...

移动开发记录 335

logisim实验——通过2个半加器实现1-bit全加器,通过4个一位全加器构成4-bit加法器(详解)

一、由异或门和与门所构成的半加器: 二、由两个半加器构成的1-bit全加器: ..

zep 1万+

Cocos2dx源码赏析(1)之启动流程与主循环

Cocos2dx源码赏析(1)之启动流程与主循环 Cocos2dx源码赏析(1)之启动流程与主循环 我们知道Cocos2dx是一款开源的跨平台游戏引擎,而学习开源项目一个较实用的办法就是读源码。所谓,“源码之前,了无秘密”。而笔者从事的也是游戏开发工作,因此,通过梳理下源码的脉络,来加深对Cocos2dx游戏引擎的理解。 既然,Cocos2dx...

weixin_34268843的博客 372

多体动力学分析软件:SIMPACK_(17).SIMPACK高级编程与脚本

自定义力和约束可以用于模拟更复杂和现实的物理场景。SIMPACK 提供了接口,允许用户通过 Python 脚本来实现自定义力和约束。以下是一个示例,展示如何定义一个自定义力函数并应用于模型。# 定义自定义力函数"""自定义力函数:param t: 时间:param position: 位置:param velocity: 速度:return: 力"""# 创建一个新的 SIMPACK 模型# 添加一个刚体# 添加一个关节# 添加一个自定义力# 设置仿真参数# 运行仿真。

kkchenjj的博客 1424

C# NX二次开发-查找连续倒圆角面

可以通过ufun函数 UF_MODL_ask_face_type 和 UF_MODL_ask_face_props 可判断处理选择相应的一组圆角面。在QQ群里有人问怎么通过一个选择一个倒圆角面来自动选中一组倒圆角面。这个是初步思路,如果有更好的思路可回复讨论一下。

fhqiwmc的博客 618

coco2d-x学习之程序入口

coco2d-x称之为跨平台,但它跟Java的跨平台是两个概念。与其说是跨平台,不如说是各平台对Opengl ES的支持。如果平台不支持Opengl ES,我真不知道怎么来移植了。 cocos2d-x在各平台的实现代码完全一致,你的工程只需要针对各平台做些配置工作即可,这点cocos2d-x的源码通过脚本都做好了。 cocos2d-x是怎么跟各个平台入口联系起来的呢,我仔细看了下代码,分...

移动开发记录 291

微信小程序 - 详细解决map地图上使用自定义图标图片或自定义样式进行markers标记点,手机真机运行时安卓系统、苹果ios系统会出现不显示标记点的问题(大概率安卓正常显示标记点,但苹果就加载失败)

微信小程序,map,地图组件,安卓android,苹果ios,真机调试,marker,标记点,在地图上标记,突然就不显示白屏了没动代码,自定义标记点icon,label动态数字,小程序地图markers标记点显示不出来,微信小程序map组件,地图加载后marker标记点ios设备不显示,android正常显示,添加多个标记点。安卓能正常显示标记点图标,IOS设备不显示标记点图标,map地图白屏不显示标记,图标真机调试不显示,自定义图标,报错,页面白屏,不报错也不显示,无法加载,图片展示不出来,iconPat

✅ 精选推荐文章 5956

cocos2dx 点击事件分析(2)

1、java端 Cocos2dxGLSurfaceView类 @Override public boolean onTouchEvent(final MotionEvent pMotionEvent) { // these data are used in ACTION_MOVE and ACTION_CANCEL ** final int pointerNumber = pMotion

思考的智慧,知识源于思考 1646

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android opengl es 雾化效果实例

雾相关: 三种雾的计算方法,怎么设置雾的颜色和雾的范围 设置雾的背景颜色:gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 设置雾气的模式:gl.glFogf(GL10.GL_FOG_MODE, fogMode[2]); 设置雾气的颜色:gl.glFogfv(GL10.GL_FOG_COLOR, fogColor, 0); 设置雾的密度:模式为LINEAR

楼中望月 4457

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Cocos2d-x Cocos2dxAccelerometer和Cocos2dxGLSurfaceView出错解决方案

最近使用最新版本的eclipse juno配置android开发cocos2dx,按照这篇文章(http://cn.cocos2d-x.org/bbs/forum.php?mod=viewthread&tid=882)进行配置后发现工程报cocos2d-x源文件报错,刚开始以为是cocos2d-x的一个bug,后面经过多方面查找资料测试,发现这并不是cocos2d-x的罪过(阿弥陀佛,cocos2

飞鱼 4203

Android opengl ES 实现后台绘图并保存成bitmap

最近在android 上有个构思,就是如何使用opengl ES在后台绘制个3D图片,然后把这个绘制好的图片保存成bitmap格式。。。想了好几天,也尝试了多种方法,但是都不行,一开始尝试用GLSurfaceView的方式,但是这样会导致我的Activity和渲染的东东发生联系,我想要要的结果是无论如何我的主Acivity都不能和我渲染的图片发生任何关系(也就是说主Acitivity不能显示任何我

HellDevil的专栏 2万+

cocos2dx lua android glsurfaceview 截图

private Bitmap createBitmapFromGLSurface(int x, int y, int w, int h, GL10 gl) throws OutOfMemoryError { int bitmapBuffer[] = new int[w * h]; int bitmapSource[] = new int[w * h]; IntBuffer i

dingyq23的专栏 1196

将 cocos2dx 背景 设置 成 透明 的方法

android层: public Cocos2dxGLSurfaceView onCreateView() {         Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);         // hello should create stencil buffer //        glSur

fuming0210sc的专栏 6271

Quick-Cocos2d-x的输入框详解

游戏引擎一般提供两种输入框:editbox和textfielttf。editbox比较简单,在iOS上效果也还行,但是在Android上就比较丑了,每次输入都会悬浮一个小框框。对于游戏来说eidtbox可以满足基本需求,毕竟输入还是少数情况。textfielttf是一种特殊的label,显示效果比较好,但是计算起来比较麻烦,要自己绘制光标,要自己绘制文字,自己计算增加和删除。 这里还是说

linking530的专栏 2893

在cocos2d-x界面中嵌入Android的WebView

实现在cocos2d-x界面中嵌入Android的WebView, 稍加修改可以嵌入任意其它的View.

峻峰飞阳的博客 blog.youkuaiyun.com/while0 7438

<cocos2dx 随记> 关于cocos2dx接Android sdk的一些坑

简单说说UI线程 :在Android中,有个非常重要的家伙非常霸道,那就是UI线程。这霸道之一:不能被阻塞。 之二:系统对每一个组件的调用都从UI线程分发出去。 简单说说openGL线程:但凡cocos2dx 启动的绘制线程都是openGL线程。就这么多 任何SDK界面的调用,必须从UI线程中调用,所以需要放到主线程中。如果我们直接从GL线程中调用,轻则调用不了,重者程序蹦

思考的智慧,知识源于思考 4699

Cocos2d-X ScrollView白屏绿屏问题解决方案

出现这类问题  有以下几种解决方案: 一:未开启OpenGL深度缓存      这个问题在ios会经常遇到,部分安卓机型也会出现,遇到此问题按照下面的方法修改:    ios 工程修改 :AppController.mm文件(在ios项目根文件夹)  EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]

我只是代码的搬运工 1622

TextureView/SurfaceView/GLSurfaceView/VideoView渲染视频(点播播放器)

OpenGL实现视频的剪裁、旋转、水印、滤镜?? 将 ffmpeg 库移植到 Android 平台?   在播放网络上的视频流时,Android原生的MediaPlayer支持两种协议,HTTP和RTSP,这两种协议最大的不同是,RTSP协议支持实时流媒体的播放,而HTTP协议不支持。因为VideoView的底层实现是MediaPlayer,因此VideoView也支持以上两种协议。 但是Andr...

ShareUs的专栏 5万+

android返回键 对话框,cocos2dx android返回键- 弹出退出对话框

第一种方式:直接修改Cocos2dxGLSurfaceView类中的onKeyDown方法,修改如下:@Overridepublic boolean onKeyDown(final int pKeyCode,final KeyEvent pKeyEvent) {switch (pKeyCode) {case KeyEvent.KEYCODE_BACK:Log.d("","KEYCODE_BACK+...

weixin_35831315的博客 189

cocos2dx Android游戏截屏分享

cocos2dx开发中,屏幕截图并保存,上传分享过程详细解读.......

Mask53的专栏 5768
上一篇: 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
Fly_7_Higher
博客等级 码龄14年 5粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值