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

时间:2011-12-23 14:55:39

标签: android libgdx kindle-fire

免责声明:这是一个奇怪的问题,只发生在Kindle Fire中(到目前为止)。

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

我有一个运行LibGDX的相对简单的应用。 LibGDX的工作方式是使用OpenGL线程调用Create()(一次),然后尽可能多地调用Render()(这样你就可以进行渲染......)。

因此,当您初始化Device时,将调用“Create()”方法,然后在初始化OpenGL表面时(所有这些都自动发生),您的Render()开始被调用。

如果OpenGL上下文丢失,损坏等,则LibGDX会调用Resize(width,height)方法。

到目前为止。超好的。

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

因此,如果条形图存在,则您的实际屏幕状态不是硬件分辨率1024x600(横向),而是1024x580。所以我在我的方法中添加了一些日志来查看发生了什么,并对此感到惊讶......(记住create(),render()和resize()方法):

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

所以屏幕已被K​​indle Fire“调整大小”,“在某些时候”。

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

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

enter image description here

有趣的部分从有时开始,条形图将不在那里,应用程序将看起来像下一个(再次,模糊的sry)。请注意顶部栏不在那里......

enter image description here

仔细检查两个镜头,你可以知道底部(应该是相同的),不是。点燃的东西很奇怪。

有什么想法吗?

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

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

提前致谢。

3 个答案:

答案 0 :(得分:6)

Kindle fire有一种奇怪的行为,一旦应用程序加载似乎它“移动”屏幕20px向上(软键高度)因此你的应用程序看起来几个像素关闭或削减。这是因为当您创建GLSurfaceView并设置renderer时,它会调用两次onSurfaceChanged方法。

第一次调用onSurfaceCreated后,分辨率值为1024x600,第一次调用onDrawFrame后第二次,值为1024x580。

解决方案是,您必须控制对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()
        }
    }

答案 1 :(得分:1)

尝试使用:

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

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

答案 2 :(得分:0)

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

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

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