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

Mar*_*ini 5 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此输入图像描述

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

在此输入图像描述

仔细检查两个镜头后,您可以判断底部(应该是相同的)不是.那种有点奇怪的事情.

有任何想法吗?

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

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

提前致谢.

ger*_*lez 6

Kindle fire有一个奇怪的行为,一旦应用程序加载似乎它"移动"屏幕20px向上(软键高度)因此你的应用程序看起来几个像素关闭或削减.那是因为当您创建GLSurfaceView并设置渲染器时,它会调用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()
        }
    }
Run Code Online (Sandbox Code Playgroud)