2011-12-23 60 views
5

免責聲明:這是一個奇怪的問題,只發生在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

回答

6

的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

0

我最近跑到這個問題,想知道你是否已經找到了解決方案。

出現黑條,因爲您的應用報告高度爲580像素高。 OpenGL有一個座標系,其中(0,0)位於屏幕的左下角。

出於某種原因,Kindle的軟欄沒有了20個像素移動EGLSurface。然而,調整大小會減小20px,留下黑色條。所以問題是EGLSurface的位置。而且有時候,由於時間安排,調整大小後會發生重定位(使黑色條消失)。

+0

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