【问题标题】:SurfaceHolder.setFormat(PixelFormat.RGBA_8888) fails on some devices and not othersSurfaceHolder.setFormat(PixelFormat.RGBA_8888) 在某些设备上失败,在其他设备上失败
【发布时间】:2014-01-13 13:51:19
【问题描述】:

我有一个具有以下视图结构的游戏应用程序。首先我有一个像这样的空 FrameLayout:

FrameLayout game_frame_layout = new FrameLayout(getApplicationContext());

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

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

customView 用于显示各种移动游戏图形,而 butView 在移动图形顶部显示一些 ImageButton。 customView 是类 CustomView 的实例,它扩展了 SurfaceView。

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 我只在全黑背景下看到与 butView 相对应的按钮。日志中没有迹象表明程序已崩溃。

有什么想法吗?

【问题讨论】:

  • 您是否需要该表面的透明度,或者您也可以试一试PixelFormat.RGB_888
  • 你的按钮还在你的“黑色”移动图形上移动吗?

标签: android android-canvas


【解决方案1】:

可能不是所有的安卓设备都支持 32/24 位像素格式,所以这就是为什么 565 总是可以工作而 888 可能会失败的原因。 您可能会尝试了解是否是硬件加速尝试禁用它的问题

【讨论】:

  • 我可以确认禁用硬件加速并没有解决问题。
  • 似乎很奇怪,它的新设备出现故障。
【解决方案2】:

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

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

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

【讨论】:

  • 黑屏 - 没有按钮。
  • 您是否发现 Honeycomb 和 JellyBean 版本之间的 surfaceview/holder 或视图绘制机制有任何变化?您的软糖设备无法显示似乎很奇怪。
【解决方案3】:

您的应用程序似乎无法在 ICS 后运行。 ICS 在图形部门进行了重大修订,最重要的是引入了TextureView,它旨在解决SurfaceView 的缺点。尝试为您的 CustomView 类扩展 TextureView 而不是 SurfaceView。欲了解更多信息,请访问Android 4.0 Graphics and Animation

【讨论】:

  • 我知道这不是一个理想的解决方案,因为它不适用于较低的 API 级别,但随着 Pre-ICS 设备的份额下降,这可能是您最好的选择。
【解决方案4】:

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

butView.setBackgroundColor(Color.TRANSPARENT);

【讨论】:

  • 没有变化 - 按钮后面仍然全黑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2022-12-30
  • 2017-05-30
相关资源
最近更新 更多