Kindle Fire在某些时候更改屏幕分辨率...

问题描述:

免责声明:这是一个奇怪的问题,只发生在Kindle Fire(到目前为止)。Kindle Fire在某些时候更改屏幕分辨率...

涉及的技术:Android SDK,Eclipse,LibGDX

我有一个相对简单的应用程序运行LibGDXLibGDX的工作方式是让OpenGL线程尽可能多地调用Create()(一次)和Render()(这样你就可以完成渲染了)。所以当你初始化设备时,你的“Create()”方法被调用,然后当OpenGL表面被初始化时(所有这些都是自动发生的),你的Render()开始被调用。

如果OpenGL上下文丢失,被销毁等,您的Resize(width,height)方法由LibGDX调用。

到目前为止。太好了。

现在我遇到了Kindle Fire的一个奇怪问题,那里的东西看起来几个像素关闭或“切割”。 Kindle Fire在屏幕底部有一个“软条”(20像素),您无法隐藏或跳过,因为该设备没有物理按钮,所以这是“确定的”。预计你会触摸这个软吧,并得到一个更大的酒吧回去,回家等。根据亚马逊,这个酒吧不能被删除。 (并非100%清楚,但没有人找到方法 - 这不会违反亚马逊规则)。我见过的唯一一个删除的应用是亚马​​逊视频播放器,仅用于从亚马逊云端流式传输的视频。所以你可以看到,似乎没有办法“永久”隐藏该栏。

因此,如果酒吧在那里,您的真实屏幕状态不是硬件分辨率1024x600(横向),而是1024x580。所以我加了一些日志记录,以我的方法,看看发生了什么事情,以及与此感到吃惊......(记得创建(),渲染()和调整()方法):

12-23 15:17:04.119: I/myapp(19921): SCREEN HEIGHT AT CREATE(): 600 
[snip other unrelated log stuff] 
12-23 15:17:04.673: I/myapp(19921): SCREEN HEIGHT AT RENDER() LOOP: 600 
[snip other unrelated log stuff] 
12-23 15:17:04.705: I/myapp(19921): MyApp - Resize() Called. 
12-23 15:17:04.705: I/myapp(19921): SCREEN HEIGHT AT RENDER() LOOP: 580 

于是,屏幕上已由Kindle Fire“调整大小”,“在某个时间点”。

有没有人遇到过这样的事情?

这是一个截图(注意顶部的黑色条,这不是我加的!)。原谅我模糊图像,但这是客户的项目,我不能“透露”任何东西。

enter image description here

有趣的部分开始时有时,酒吧就不会在那里,应用程序将看样下(同样,对于SRY模糊)。注意最上面一栏是多么的不存在...

enter image description here

在这两个镜头的仔细检查,你可以说底部(这应该是一样的),是不是。 kindle正在做奇怪的事情。

任何想法?

这些资产最初被打包为1024x600,但我们已经改变了(现在580),并假设视口现在是1024x580,但我想知道是否有人找到更好的方法来处理这个废话?:)

note:我们在清单中有android:theme =“@ android:style/Theme.NoTitleBar.Fullscreen”。什么都不做。

在此先感谢。

+1

我无法帮助Kindle问题本身,但resize()方法可能会在任何时间点被调用,并且与上下文丢失无关。上下文丢失通过对resume()的调用来指示。 – badlogic 2012-01-03 09:38:11

+0

@badlogic嗨马里奥;)(格里佐尔在这里)。是的,我们正在等待resize(),但这似乎是Kindle Fire问题(由其他人报告)。亚马逊在那里做了一些令人讨厌的东西......:S感谢你' – 2012-01-04 14:30:49

的Kindle Fire有一个奇怪的行为,一旦应用程序加载好像它 “动作” 屏幕为20px了(Softbar高度),因此您的应用程序的外观几个像素关闭或切断。这是因为当你创建你的GLSurfaceView并设置你的renderer它调用两次onSurfaceChanged方法。

第一次,onSurfaceCreated被调用后,用1024×600的分辨率值,并且第一呼叫之后的第二时间与1024x580的值onDrawFrame。

的解决方案,你必须控制两个调用onSurfaceChanged和调整的OpenGL视口。

private static boolean appStarted = false; 
    ... 

    private static class Renderer implements GLSurfaceView.Renderer 
    { 
     public void onSurfaceChanged(GL10 gl, int width, int height) 
     { 
      if (!appStarted) 
      { 
       //Initialization (Resolution 1024x600) 
      } 
      else 
      { 
       //Second call, screen resolution changed (Resolution 1024x580) 
       //Resize(width,height) 
      } 
      appStarted = true; 
     } 

     public void onDrawFrame(GL10 gl) { 
     //Render() 
     } 

     public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     //Create() 
     } 
    } 
+0

我会看看这个,谢谢。当我设法做到这一点时,我会让你知道。 – 2012-02-10 15:19:22

+1

我希望它可以帮助你,我使用该代码来管理我的项目中的这个问题:) – gergonzalez 2012-02-11 08:08:46

尝试使用这样的:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

来源:https://developer.amazon.com/help/faq.html?ref_=pe_132830_21362890#KindleFire

我最近跑到这个问题,想知道你是否已经找到了解决方案。

出现黑条,因为您的应用报告高度为580像素高。 OpenGL有一个坐标系,其中(0,0)位于屏幕的左下角。

出于某种原因,Kindle的软栏没有了20个像素移动EGLSurface。然而,调整大小会减小20px,留下黑色条。所以问题是EGLSurface的位置。而且有时候,由于时间安排,调整大小后会发生重定位(使黑色条消失)。

+0

解决方案是使用上面的解决方案:http://*.com/a/9225218/2684 – 2012-07-11 09:51:47