【问题标题】:Android Fragment Transitions with GLSurfaceView使用 GLSurfaceView 的 Android 片段转换
【发布时间】:2014-07-31 23:03:48
【问题描述】:

我在片段中有一个GLSurfaceView,这是我的主要片段。当我从带有 GLSurfaceView 的片段过渡到没有 GLSurfaceView 的另一个片段时,GLSurfaceView 在过渡开始前稍微向上移动。

我尝试设置GLSurfaceView.setZOrderOnTop(true),但它不起作用,而且在这种情况下实际上弊大于利,因为我的广告和导航抽屉变得模糊。

我尝试隐藏托管 GLSurfaceView 的 Fragment,仍然没有效果。

我尝试暂停托管 GLSurfaceView 的片段,因此同时暂停 GLSurfaceView 没有效果。

当 GLSurfaceView 向上移动时,屏幕是黑色的,而 GLSurfaceView 应该是。屏幕上的黑色区域似乎特定于片段转换,因为如果我删除转换并简单地用片段事务进行替换,那么 glsurfaceview 运动就消失了。这不是一个解决方案,因为我希望我的应用程序中的转换从一个片段到另一个片段。

最后,我意识到 ondestroyview 正在使用 GLSurfaceView 在片段上调用,因此在动画过渡到下一个片段之前破坏了视图,我认为这可能是问题所在。

这是一些代码...

使用 glsurfaceview 添加片段

        //clear all fragments from the back stack if there are any
        getSupportFragmentManager()
        .popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

        //start a new deploy fragment
        getSupportFragmentManager()
        .beginTransaction()
        .add(R.id.container, new DeployFragment(), "Main Fragment")
        .commit();

用偏好列表片段替换 glsurfaceview 片段

         getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left,
         R.anim.enter_from_left, R.anim.exit_to_right)
        .replace(R.id.container, new SettingsFragment(), "Settings Fragment")
        .addToBackStack(null)
        .commit(); 

当从 DeployFragment(glsurfaceview 片段)过渡到 SettingsFragment(常规列表片段)时,GLSurfaceView 会向上移动一点,可能与堆叠在一起的 2 个操作栏的高度差不多。向上移动的 glsurfaceview 还会在屏幕上显示 GLSurfaceView 应该是的黑色区域,但事实并非如此。

任何想法如何解决这个问题?


问题视频

http://youtu.be/RUSNBd9iuXs

选择一个选项后,您会看到 GLSurfaceView 向上移动,露出黑色空间


【问题讨论】:

  • 请记住,SurfaceView 表面是独立于所有 View UI 元素合成的。此外,它们的位置由窗口管理器管理,而不是在应用程序内。有关完整故事,请参阅source.android.com/devices/graphics/architecture.html
  • 您在使用支持片段时找到解决方案了吗?我现在也面临同样的问题

标签: android android-fragments android-support-library glsurfaceview


【解决方案1】:

为 SurfaceView 设置动画过渡的唯一方法是在内容之前绘制位图,并将其设置为具有表面的布局顶部的 imageview 源。但请注意,如果它是 android 2.x 的全屏布局,则它是大位图,这种方法可能会由于缺少本机堆(不是 java)而导致您的应用程序崩溃,所以我建议仅对 ics+ 执行此操作

【讨论】:

  • 所以我应该将 glsurfaceview 上的所有内容绘制为位图,然后将该位图设置为片段中的图像视图,确保图像视图是全屏的......然后转换到另一个片段,如果我理解正确?如果是这种情况,如何将 glsurfaceview 渲染为位图?另外......我认为我遇到的问题是当我转换到另一个片段时 glsurfaceview 被破坏,因为 ondestroyview 被调用,破坏了片段中的 glsurfaceview。我认为这可能会导致所有问题。
【解决方案2】:

我想我明白了。我花了几个小时来解决这个问题,所以我会发布我认为可以解决的问题,但可能不是最好的答案。我发现如果我将支持片段与 glsurfaceview 一起使用,并尝试动画过渡到另一个片段,那么我会遇到我在上面的问题中描述并在视频中显示的奇怪问题。

如果我使用不支持的片段,那么这个问题就不存在了。使用非支持片段会带来很多其他问题,所以如果有人在使用支持片段时想出解决这个问题的方法,那么我会全力以赴。

使用非支持片段的问题

  • 我必须至少针对 api 11 (honeycomb) 或更高版本,随着时间的推移,这将不再是问题

  • 我正在使用嵌套片段,因此我可以选择将支持与不支持的片段混合使用,这很讨厌,或者针对 api 19 或更高版本将 getChildFragmentManager() 与不支持的片段一起使用,这也很讨厌。

  • 我正在使用视图寻呼机,所以看起来我必须再次将支持与不支持混合在一起,或者为 v13 导入 fragmentpageradapter,它与 api 13 及更高版本兼容。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多