2014-01-13 61 views
14

我有一個具有以下Views視圖結構的遊戲應用程序。首先我有一個空的FrameLayout像這樣:SurfaceHolder.setFormat(PixelFormat.RGBA_8888)在某些設備上失敗,而不是其他設備

FrameLayout game_frame_layout = new FrameLayout(getApplicationContext()); 

然後我兩個視圖添加到它,像這樣:

game_frame_layout.addView(customView); 
game_frame_layout.addView(butView); 

的customView是用於顯示各種移動遊戲顯卡的同時butView顯示一些ImageButtons在移動圖形的頂部。 customView是擴展SurfaceView的類CustomView的一個實例。

CustomView包括以下代碼

void updateView() 
    { 
     final SurfaceHolder holder = getHolder(); 
     holder.setFormat(PixelFormat.RGBA_8888); 

     try 
     { 
       Canvas canvas = holder.lockCanvas(); 
       if (canvas != null) 
       { 
        onDraw(canvas); 

        holder.unlockCanvasAndPost(canvas); 
       } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

holder.setFormat(PixelFormat.RGBA_8888);是最近添加(見here)。如果沒有這一行,我的動畫圖形顯示爲顏色太少的格式(實驗中我推測它是「RGB_565」),所以我得到了一些banding工件。當我添加setFormat線時,圖形在我的三星Galaxy Tab 10.1(Android 3.1)上顯示完美(沒有條帶)...但在另外三個設備上:三星GT-l9100(4.1.2),Nexus 7 ME370T 4.4 .2和HTC One X 4.2.2我只看到與黑色背景對應的按鈕。日誌中沒有指示程序崩潰。

任何想法?

+0

您是否需要該表面的透明度,或者您是否還可以給「PixelFormat.RGB_888」一個鏡頭? – tiguchi

+0

你的按鈕還在你的「黑色」移動圖形上移動嗎? –

回答

2

大概不是所有的android設備都支持32/24位像素格式,所以這就是爲什麼565總是在工作,而888可能會失敗。 你可以試着去了解它是否與硬件加速試圖禁用它

+0

我可以確認禁用硬件加速並未解決問題。 – Mick

+0

似乎很奇怪,它的新設備失敗了。 – Mick

3

設置的setContentView(前的像素格式的問題)上的活動:

getWindow().setFormat(PixelFormat.RGBA_8888); 

+0

這是我嘗試的第一件事 - 在onCreate附近(沒有持有者的setFormat),但是我的customView的格式似乎是565,即我仍然可以看到banding。 – Mick

+0

我只是試了一遍,這次在setContentView()之前立即調用setFormat()...但沒有變化 - 仍然是565. – Mick

0

我很好奇,如果你設置butView的背景透明。

butView.setBackgroundColor(Color.TRANSPARENT); 
+0

沒有變化 - 仍然都是黑色後面的按鈕。 – Mick

2

當您更改將訂單添加到game_frame_layout的訂單時會發生什麼? 首先butView然後customView:

game_frame_layout.addView(butView); 
game_frame_layout.addView(customView); 

我假設butView將是不可見的,但我很好奇的customView是否正確呈現其內容。

+0

黑色屏幕 - 無按鈕。 – Mick

+0

您是否發現Honeycomb和JellyBean發行版之間的SurfaceView/holder或view drawing機制有任何更改?看起來很奇怪,你的軟糖設備無法顯示。 – Delblanco

1

您的應用程序似乎沒有工作後ICS。 ICS在圖形部門看到了重大修訂,其中最重要的是引入了TextureView,旨在解決SurfaceView的缺點。嘗試擴展TextureView而不是SurfaceView,以便爲您的CustomView課程提供幫助。欲瞭解更多信息,請訪問Android 4.0 Graphics and Animation

+0

我知道它不是一個理想的解決方案,因爲它不適用於較低的API級別,但隨着Pre-ICS設備的份額下降,這可能是您最好的選擇。 – Shakti

相關問題