问题标签 [surfaceview]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1222 浏览

android - AndEngine & SurfaceView (CameraPreview)

如何添加显示相机预览的 SurfaceView 作为 AndEngine 的 BaseGameActivity 的背景(物理示例)。

0 投票
1 回答
2303 浏览

android - 在另一个 Acitivity 获得焦点后返回 SurfaceView

我正在使用 LunarLander API 演示为 Android 开发 RPG。我已经使用这个演示制作了一个游戏(Porcupine Assassin,看看!)所以我很好地掌握了 Canvas 类和那种性质的东西。

我的问题是,在 RPG 中,您需要一种访问库存、统计数据等的方法。所以我设置了 BACK 按钮来启动类 Inventory.java。当我完成()库存活动并尝试返回游戏(SurfaceView)时,我遇到了问题。

这是 SurfaceCreated() 回调:

我得到了一个由“IllegalThreadStateException:线程已经启动”引起的 FC,所以我在 SurfaceCreated() 回调中放置了一个 try/catch。使用 try/catch,没有发生 FC,但我返回黑屏。

我尝试取出 try/catch 并在开头添加一个检查:if(!thread.isAlive())。这样,如果线程已经启动,它就不会做任何事情。奇怪的是,我得到了相同的 FC“线程已经启动”,所以 thread.isAlive() 必须返回 false .. ??

我也有来自 API 的 onWindowFocusChanged() 方法:

我非常热衷于游戏方面,我已经为我的 RPG 奠定了大部分基础。但我脑子里全是这些 Android/Java 的东西。谁能指出我正确的方向?

0 投票
2 回答
2509 浏览

android - 合成 Android MapView 和 SurfaceView

我有一个带有 SurfaceView 和 MapView 的应用程序。它们显示在单个视图中,如下所示:

请注意,MapView 位于 SurfaceView 之前。正因为如此,MapView 被绘制在 SurfaceView 的“下方”,而我看到的只是黑色背景,而我在 SurfaceView 上绘制的东西则显示出来。如果我交换顺序,并将 SurfaceView 首先放在文件中,然后将 MapView 放在第二位,则会绘制 MapView,而 SurfaceView 则不显示。

根据SurfaceView Javadoc

表面是 Z 顺序的,因此它位于持有其 SurfaceView 的窗口后面;SurfaceView 在其窗口中打了一个孔以显示其表面。视图层次结构将负责正确地将 SurfaceView 的任何兄弟姐妹与 Surface 合成,这些兄弟通常会出现在它的顶部。

对我来说,这意味着我应该能够将 SurfaceView 放在文件中的第一位,并让它“穿透” MapView 并显示它的内容。但是,实际上,它们似乎是两种视图,一次只能看到一个。

经过思考:我尝试将背景设置为#00000000,以便背景的alpha为零(即透明),但它没有任何效果。

0 投票
1 回答
3886 浏览

java - 安卓surfaceview不能工作

这是一个简单的问题,但我无法弄清楚:

这是我的 xml:

在月球着陆器中,主线程使用

但我不能用我的

如果我将 R.layout.main 更改为 --> new testA(this) ,它可以工作

(testA是扩展SurfaceView实现SurfaceHolder.Callback的类)

为什么??

0 投票
2 回答
7883 浏览

android - 关于android canvas绘图的效率

我一直想知道画布是否有限制边界。

我的意思是,如果我使用诸如drawline(), drawbitmap(), drawcircle(), android 真的在画布上绘制一些东西并浪费一些 CPU 周期之类的功能吗?

因为在所有绘图功能之后,屏幕上的实际图片打印是由屏幕大小决定的。如果我画的东西超出屏幕尺寸,它就不会出现。

我想通过调用许多绘图函数在我的画布上做一些小细节并使我的表面“闪闪发光”。如果超出范围,我不想使用它们,如果它们使我的绘图速度变慢。

我正在通过surfaceview的结构开发一个小游戏,感谢您的任何建议。

例如:

我有一个机器人从屏幕外的 <-> b 行走。

在画布上绘制机器人行走图需要 20 个绘图函数。如果我滚动屏幕,那么我可以看到机器人。

所以如果在屏幕外绘制功能真的和在屏幕上绘制一样花费时间。我必须检测到,只有当用户可以看到机器人的位置时,我才会绘制。否则,我不会。

如果绘图功能不会浪费太多CPU周期,那么即使当前屏幕看不到机器人,我也可以每次都绘制。

0 投票
2 回答
9654 浏览

android - 在 SurfaceView 上覆盖 Android 布局

我正在使用与 Google 提供的 Lunar Lander 示例类似的表面视图设计一个简单的 Android 游戏。我希望在屏幕上弹出各种内容,例如高分、消息、菜单等,而表面视图仍在后台。

问题是我希望“弹出窗口”包含许多设计元素,如图像、文本框等。有没有一种方法可以在 XML 中创建布局来设计我想要的弹出窗口,然后在表面视图上显示为一个对象,而不必在代码中一个一个地构造每个单独的元素并将它们全部绘制到画布上?

我想从屏幕一侧为弹出窗口设置动画,所以如果我在 XML 中设计布局以便所有对象都知道它们彼此之间的关系,然后将该布局作为一个对象进行动画处理,那就太好了。

它让我觉得很简单,但我似乎无法找到如何实现它。

0 投票
1 回答
4021 浏览

java - 如何从 SurfaceView 类或嵌套线程中结束活动

我正在编写一个应用程序(游戏),我想在用户游戏失败时结束游戏活动。我的游戏大致基于 lunarlander,所以我认为以 lunarlander 为例寻求帮助可能更容易,因为很多人都熟悉它。

当用户在 lunarlander 游戏失败时,我想自动结束活动(因为我的应用程序使用了多个活动)。我知道我可以在活动类中使用 finish() 方法,但我不能在 surfaceview 类或其嵌套线程中使用该方法。我可以从这个类中做些什么来结束活动或创建一个返回活动类的触发器?

或者,我应该用一种完全不同的方式来解决这个问题吗?

谢谢。

0 投票
1 回答
1831 浏览

android - 将 SurfaceView 与 TextView 和 Buttons 等其他视图结合使用

我对 android 编程完全陌生(只是做了一些教程/阅读了开发指南等),并且作为每个新手我都想做一个无用的游戏:-)。

目前我正在为不同视图的布局而苦苦挣扎。与示例类似,我创建了一个扩展 aSurfaceView并将其放入 a 的类FrameLayout。围绕这一点SurfaceView,我想拥有其他 View 之类的Buttons& TextViews。像这样的东西:

FrameLayout我已经设法用and RelativeLayouts(粘贴在屏幕边缘)做这样的事情,TextViews但我想更好地控制它的大小,SurfaceView因为它应该是对象的宽度和高度的倍数我会画进去的。我已经尝试设置layout_width和设置layout_height一些 dp 值,但是当我开始在 0,0 处绘画时,它仍然在最左上角(在哪里TextView..)。

那么,实现上述布局的最佳实践是什么?使用什么布局?draw()或者我应该更好地在 my 的函数中绘制我的文本SurfaceView

0 投票
2 回答
2696 浏览

java - Android 模拟器没有模拟正确的密度或分辨率。可能是表面视图实现问题

我正在构建一个使用扩展surfaceholder.callback 的surfaceview 类的小应用程序。它的实现就像 lunarlander 示例一样。我的问题是我使用的每种类型的模拟器(低、中或高密度)似乎并没有真正改变屏幕的密度或分辨率到我所期望的。我最近问了这个关于堆栈溢出的问题,我突然意识到我没有对那个函数做任何错误,问题是不知何故我使用的任何模拟器都在中等密度下得到了认可。

高密度仿真器屏幕显示非常像素化的图像。中等密度的模拟器图像看起来很棒。低密度仿真器图像看起来像素化,但不如 hdpi 糟糕。

我在每个模拟器上做了一个 mySurfaceHolder.getSurfaceFrame() 并想出了这个:

  • WVGA800 - 480x800 - hdpi - 生成表面 320 x 508
  • Default(HVGA) - mdpi - 生成一个 320 x 455 的表面
  • QVGA - 240x320 - ldpi - 生成表面 320 x 402

这些表面不应该分别是 480x800、320x480 和 240x320 吗?编辑:320x455 是有道理的,其余的可能在标题栏中占据。但是低/高呢?

所以,我不确定我的问题是否是:

  1. 我如何设置模拟器。– 我使用标准设置的 HVGA、QVGA、WVGA800 和 WVGA854(无自定义分辨率)

  2. 我在surfaceview 类中的代码有问题。请注意,我没有手动设置大小,我依赖于从这个回调方法返回的大小:

.

有什么想法吗?与往常一样,我感谢您的所有帮助!

0 投票
3 回答
16955 浏览

android - 使用 SurfaceView 和线程策略进行游戏开发的编程

我正在使用 SurfaceView 和渲染线程来开发基于 LunarLander 等结构的游戏。

但是,我遇到了很多问题,在这里我想一一指出。我希望任何想要开发游戏的人都不再需要与他们斗争。任何对结构有更好了解的人都可以分享他们的经验,因为我还是 android 新手并且渴望学习:)

[1] 该函数thread.start()不应被多次调用。

许多文章提到在创建表面时创建一个线程,以便在活动暂停后使用该方法再次渲染:

您可以看到,如果线程没有终止并且函数被调用,则活动会崩溃。

[2] 如果按下“电源”或“红色电话”按钮,或者电话空闲几分钟,活动将处于onPause()状态,但线程仍在运行。这是一个非常糟糕的做法,所以我需要找到一种方法让线程停止,然后在onResume().

[3] 如果屏幕锁定是纵向/横向,并且您的游戏被粘在另一个方向,屏幕锁定会强制您“定位”一次。这意味着再次开始活动。我仍然找不到解决方案。(正如我在Android 屏幕方向错误中提到的)

这是我解决这些问题的代码:

UIThread

游戏视图

显现

我使用onResume()而不是surfaceCreated()新线程。我设置了一个布尔值surfaceCreated来知道是onResume()来自第一次创建应用程序,还是来自“屏幕关闭”的情况。

所以每次都会onPause()调用线程死。似乎是一个很好的做法。让线程停止然后再次恢复的另一种方法是同步对象并调用等待/通知。但是不知道好不好。

有没有更好的方法来控制渲染线程?