2014-01-13 60 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

相关问题