我试图通过代码获取我的游戏截图并通过意图分享.我可以做这些事情,但屏幕截图总是显示为黑色.以下是与共享屏幕截图相关的代码:
View view = MainActivity.getView();
view.setDrawingCacheEnabled(true);
Bitmap screen = Bitmap.createBitmap(view.getDrawingCache(true));
.. save Bitmap
Run Code Online (Sandbox Code Playgroud)
这是在MainActivity中:
view = new GameView(this);
view.setLayoutParams(new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.FILL_PARENT,
RelativeLayout.LayoutParams.FILL_PARENT));
public static SurfaceView getView() {
return view;
}
Run Code Online (Sandbox Code Playgroud)
而观点本身:
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
private static SurfaceHolder surfaceHolder;
...etc
Run Code Online (Sandbox Code Playgroud)
这就是我绘制一切的方式:
Canvas canvas = surfaceHolder.lockCanvas(null);
if (canvas != null) {
Game.draw(canvas);
...
Run Code Online (Sandbox Code Playgroud)
好的,根据一些答案,我构建了这个:
public static void share() {
Bitmap screen = GameView.SavePixels(0, 0, Screen.width, Screen.height);
Calendar c = Calendar.getInstance();
Date d = c.getTime();
String path = …Run Code Online (Sandbox Code Playgroud) 我正在尝试截取Android OpenGL的截图.
我找到的代码如下:
nt size = width * height;
ByteBuffer buf = ByteBuffer.allocateDirect(size * 4);
buf.order(ByteOrder.nativeOrder());
glContext.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, buf);
int data[] = new int[size];
buf.asIntBuffer().get(data);
buf = null;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.setPixels(data, size-width, -width, 0, 0, width, height);
data = null;
short sdata[] = new short[size];
ShortBuffer sbuf = ShortBuffer.wrap(sdata);
bitmap.copyPixelsToBuffer(sbuf);
for (int i = 0; i < size; ++i) {
//BGR-565 to RGB-565
short v = sdata[i];
sdata[i] = (short) (((v&0x1f) << …Run Code Online (Sandbox Code Playgroud) 我想GLES20在选择选项菜单中的项目时调用方法.
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.clear:
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
break;
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我在main线程而不是GLThread.它说:
调用没有当前上下文的OpenGL ES API(每个线程记录一次)
但是我需要做些什么才能让事情发挥作用?
我一直致力于一个项目,用户可以在其中与a交互以GLSurfaceView在屏幕上绘制形状.这一切都很好,花花公子,但现在我尝试做两件事:1)创建他们的绘图的缩略图,2)保存他们的绘图.重要的是要注意用户可以绘制比屏幕大的图像.
就我的研究表明,最好使用a Bitmap(可以是1)渲染到Canvas缩略图,2)保存到文件系统,这实现了我的两个目标).
最初,我试图Renderer从GLSurfaceView通道中读取glReadPixels,但事实证明我无法从中获取屏幕外数据.相反,我选择做一个离屏缓冲区来生成图像的渲染,可以将其转换为Bitmap.
我发现了一个可爱的帖子,它提供了一个名为的类的代码PixelBuffer,我现在正在使用它.(我做了一些调整,但无论是否有调整,我都会遇到所有问题.)
现在,当使用getBitmap()代码时(我将在PixelBuffer论坛帖子不可读的情况下发布),我得到了一堆called unimplemented OpenGL ES API.起初这让我很奇怪,所以我做了一些调查.事实证明,由于某种原因,PixelBuffer该类使用OpenGL ES 2.0,而GLSurfaceView使用的是OpenGL ES 1.1.我正在使用的设备(Galaxy Nexus)不支持2.0.(而且,我想支持最大范围的设备.)
所以,这是我的问题:如何强制我的PixelBuffer类使用OpenGL ES 1.1 API?我已经在我的清单中添加了以下内容:
<uses-feature android:glEsVersion="0x00010001" />
Run Code Online (Sandbox Code Playgroud)
另外,我试图设置版本使用int[] version = new int[] { 1, 1 };,但无济于事.
PixelBuffer我正在使用的代码:链接.调用的问题Renderer在第91行.版本代码在第39行开始.
这是我用来创建的代码PixelBuffer,从GLSurfaceView对象调用:
setEGLConfigChooser(8, 8, 8, 8, 0, 0);
mRenderer = …Run Code Online (Sandbox Code Playgroud)