【问题标题】:Can I lay a fixed layer over a custom canvas?我可以在自定义画布上放置一个固定图层吗?
【发布时间】:2017-12-05 18:57:02
【问题描述】:

在 Android Studio 中,我正在开发一款游戏,在该游戏中,我使用 SurfaceView 对象以 60fps 的速度绘制动画。我使用半透明图像作为顶层来隐藏比赛场地的边缘——一种“战争迷雾”效果,让玩家不知道在阴影之外会发生什么。

我的问题是我需要为每一帧绘制这个阴影图像,即使阴影永远不会改变或移动,即使比赛场地向右/向左/向上/向下滚动也是如此。而且它是全屏图像,因此会减慢游戏速度。

有没有一种方法可以在动画自定义画布上创建一次性叠加层?我还想与它下面的画布进行交互,就好像覆盖层甚至不存在一样。

【问题讨论】:

  • 也许可以使用另一个视图,该视图正好位于带有自定义画布的视图上方。这个视图可以有“阴影”作为背景。
  • 使用相同的画布在其上绘制

标签: java android android-canvas android-drawable bitmapfactory


【解决方案1】:

您是否尝试过在您的表面视图上放置一个全屏 ImageView 并将“战争迷雾”图像设置为此,应该绘制一次(这是假设您的“战争迷雾是透明的”的背景)。

如果您需要更高级的东西,那么 ViewOverlay 应该会覆盖您,但我的理解是当单个视图希望在动画边界之外绘制时使用,因为您使用的是全屏表面视图,这应该是不必要的

https://developer.android.com/reference/android/view/ViewOverlay.html

也没有理由不能将表面视图粘贴在表面视图上。一种用于战争迷雾/屏幕效果,一种用于游戏表面。

【讨论】:

  • 尽管您的解决方案看起来不错,但我仍在为此苦苦挣扎。我只需要在 SurfaceView 中找到图像不会被画布绘制覆盖的正确位置。我需要一些额外的学习。 ViewOverlay 可能是一个更好的解决方案,但我致力于为 JellyBeaners 编写此代码。 ViewOverlay 仅适用于 API 级别 18 及更高级别。
【解决方案2】:

根据Thomas Stevens 的回复,我研究了使用 ImageView 覆盖 SurfaceView 的选项。我的解决方案是添加一个包含所需 ImageView 的 FrameLayout。 (这样,我可以通过更新布局 XML 来向叠加层添加额外的视图。)

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //temporarily set the view to the overlay layout to gain access to the frame
    setContentView(R.layout.overlay_game);
    FrameLayout overlayLayout = (FrameLayout)findViewById(R.id.gameOverlayFrame);

    //set the final view to the active game surface (a Java-coded SurfaceView object)
    setContentView(new GameSurface(this));
    //add the overlay view on top of the game surface view
    addContentView(overlayLayout, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
}

我不认为这是解决方案...只是对我有用的解决方案。

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 2011-06-15
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多