在某些设备上,SurfaceHolder.setFormat(PixelFormat.RGBA_8888) 失败,而在其他设备上则没有失败。

15

我有一个游戏应用程序,其视图结构如下。首先,我有一个空的FrameLayout,如下所示:

FrameLayout game_frame_layout = new FrameLayout(getApplicationContext());

然后我像这样为其添加了两个视图:

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

customView用于显示各种移动游戏图形,而butView在移动图形之上显示一些ImageButton。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); 这一行是最近添加的(参见这里)。如果没有这行代码,我的动画图形会出现颜色太少的格式(通过实验我推断出它是“RGB_565”),因此我会得到一些条纹状伪影。当我添加了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,我只能看到对应于butView的按钮,而整个背景都是黑色。日志中没有任何程序崩溃的迹象。

有任何想法吗?


你需要这个表面的透明度吗?或者你可以尝试使用 PixelFormat.RGB_888 吗? - tiguchi
你的按钮是否仍然在“黑色”移动图形上移动? - Sherif elKhatib
4个回答

2

可能并非所有安卓设备都支持32/24位像素格式,所以565格式一直有效而888格式可能会失败。 你可以尝试了解是否存在硬件加速问题并尝试禁用它。


我可以确认禁用硬件加速并没有解决问题。 - Mick
看起来很奇怪,新设备居然出现故障。 - Mick

2
当您更改将它们添加到game_frame_layout的顺序时会发生什么? 首先是butView,然后是customView:
game_frame_layout.addView(butView);
game_frame_layout.addView(customView);

我假设butView不可见,但我很好奇customView是否能正确地呈现其内容。


黑屏 - 没有按钮。 - Mick
你在Honeycomb和JellyBean版本之间的surfaceview/holder或view绘制机制中发现了任何变化吗?看起来很奇怪,为什么你的JellyBean设备无法显示。 - Delblanco

1

您的应用程序似乎在ICS后无法正常工作。ICS在图形部分进行了重大修订,最显着的是引入了TextureView,旨在解决SurfaceView的缺点。尝试扩展TextureView而不是SurfaceView用于您的CustomView类。有关更多信息,请访问{{link1:Android 4.0 Graphics and Animation}}。


我知道这不是一种理想的解决方案,因为它无法在较低的API级别上运行,但随着Pre-ICS设备份额的减少,这可能是您最好的选择。 - Shakti

0

我很好奇如果你将butView的背景设置为透明。

butView.setBackgroundColor(Color.TRANSPARENT);

没有变化 - 按钮后面仍然是全黑的。 - Mick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接