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绘制显示区。 立即下载

相关推荐

硬件原理图分析

文章目录1 硬件原理图分析1.1 MCU部分1.2 NB部分1.3 电源部分 1 硬件原理图分析 1.1 MCU部分 MCU接口部分没啥需要注意,都是常规操作。 1.2 NB部分 U4是用来防静电的。 由于NB的以上几个引脚只支持1.8V,所以这里需要3.3V转1.8V的电路。只要把握住谁改变电平就好分析是怎么实现电平转换的了。 1.3 电源部分 图中的MOS是用来实现USB和电池同时插入时只能USB供电功能的。 ...

木子皿--啥都不会的菜鸟 8174

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

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

weixin_30699465的博客 214

从STM32转战STC32G?逐飞开源库帮你快速上手GPIO、PWM与ADC(避坑指南)

本文详细介绍了从STM32迁移到STC32G32K128的开发实践,重点解析了GPIO、PWM和ADC等基础外设的设计差异,并提供了基于逐飞开源库的高效应用方案。通过对比两种平台的开发工具和操作方式,帮助开发者快速上手STC32G,避免常见陷阱,提升开发效率。

weixin_30316097的博客 529

cocos2dx android平台事件系统解析

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

linuxheik的专栏 415

【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点

【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点

qq_44703886的博客 3621

从牛顿冷却定律到热传导方程:一维热传导方程的物理直觉与数学推导

本文从牛顿冷却定律出发,结合傅里叶热传导定律和能量守恒原理,系统推导了一维热传导方程的数学形式。通过微元分析和物理直觉,揭示了温度随时间变化与空间二阶导数之间的关系,并阐释了热扩散率α的物理意义。文章还探讨了方程的边界条件、数值解法及其在材料科学和工程中的应用,为理解热量传递提供了清晰的物理图像和数学框架。

palm99的专栏 839

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

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

移动开发记录 335

SAP-MM-PR分配货源并转PO

SAP-MM-PR分配货源并转PO

yanzibing99的博客 5474

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

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

weixin_34268843的博客 372

基于PPT的三维光路结构示意图绘制实例演示-技术细节

基于PPT的三维光路结构示意图绘制实例演示-技术细节

简单光学 7472

YOLOv8【第二十六章:游戏与娱乐产业 YOLO 应用篇·第14节】游戏性能压测:YOLO 在高帧率引擎下的优化指南!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 326

coco2d-x学习之程序入口

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

移动开发记录 291

YOLOv5改进 | 注意力篇 | iRMB倒置残差块注意力机制(轻量化注意力机制,附二次创新)

本文给家大家带来的改进机制是iRMB,其是在论文Rethinking Mobile Block for Efficient Attention-based Models种提出,论文提出了一个新的主干网络EMO(后面我也会教大家如何使用该主干,本文先教大家使用该文中提出的注意力机制)。其主要思想是将轻量级的CNN架构与基于注意力的模型结构相结合(有点类似ACmix)我将iRMB和C2f结合,然后也将其用在了检测头种进行尝试三种结果进行对比,针对的作用也不相同,但是无论那种实验均有一定涨点效果。

Snu77的博客 2571

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

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

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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、付费专栏及课程。

余额充值