【问题标题】:Kindle Fire changes Screen Resolution at some point…Kindle Fire 有时会更改屏幕分辨率……
【发布时间】:2011-12-23 14:55:38
【问题描述】:

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

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

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

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

如果 OpenGL 上下文丢失、破坏等,您的 Resize(width,height) 方法将由 LibGDX 调用。

到目前为止。超好的。

现在我在 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

因此,Kindle Fire“在某个时候”“调整了”屏幕的大小。

有人遇到过这种情况吗?

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

有趣的部分开始于有时,该栏将不存在,应用程序将看起来像下一个(再次,为模糊而抱歉)。请注意顶部栏不存在...

在仔细检查两个镜头后,您可以看出底部(应该相同)不是。 kindle 正在做奇怪的事情。

有什么想法吗?

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

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

提前致谢。

【问题讨论】:

  • 我对 Kindle 问题本身无能为力,但是 resize() 方法可以在任何时间点调用,并且与上下文丢失无关。调用 resume() 表明上下文丢失。
  • @badlogic hi Mario ;) (这里是 Gryzor)。是的,我们正在等待 resize() 但这似乎是一个 Kindle Fire 问题(由其他人报告)。亚马逊在那里做了一些令人讨厌的事情……:谢谢你

标签: android libgdx kindle-fire


【解决方案1】:

Kindle fire 有一个奇怪的行为,一旦应用程序加载后,它看起来像是将屏幕“移动”了 20 像素(软栏高度),因此您的应用程序看起来有几个像素偏移或剪切。这是因为当您创建 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()
        }
    }

【讨论】:

  • 我会看看这个,谢谢。当我设法做到这一点时,我会告诉你的。
  • 希望对您有所帮助,我正在使用该代码在我的项目中管理此问题 :)
【解决方案2】:

试试这个:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多