【问题标题】:SurfaceView and adding and deleting other viewsSurfaceView 以及添加和删除其他视图
【发布时间】:2012-07-20 20:28:01
【问题描述】:

我正在尝试创建一个基于 2D 游戏框架的简单游戏,如 Mario Zechner 于 2011 年 Apress 所著的“Beginning Android Games”一书中所述。也许这有帮助,也许没有,但不管怎样:

整场比赛我只有一项活动。一切都渲染到位图上,然后发送到 SurfaceView,发送到 SurfaceView 的内容会根据游戏所在的屏幕而变化。

我想实现一个简单的高分系统,让用户在主菜单屏幕上的 EditView 中输入他们的名字。我已经能够将 SurfaceView 和 EditView 与 RelativeLayout 结合起来,但问题是一旦用户移过主菜单屏幕,就摆脱了 EditView。

这门课还有更多内容,但这里有一个我认为很重要的片段:

    public abstract class AndroidGame extends Activity implements Game{
      public EditText et;
      public RelativeLayout rl;

      public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        et = new EditText(this);
        renderView = new AndroidFastRenderView(this, frameBuffer);

        rl = new RelativeLayout(this);
        rl.addView(renderView);
        rl.addView(et);
        setContentView(rl);
      }
    } 

以上是游戏的唯一活动。 AndroidFastRenderView 类扩展了 SurfaceView。我遇到的问题是,虽然我需要 SurfaceView 在整个游戏中持续存在,但我需要 EditText 只持续一小段时间,然后根据触摸事件消失。

我尝试从我的 MainMenuScreen 类中调用 RelativeLayout.removeView(et),该类负责构造发送到 SurfaceView 的位图以及监听触摸事件。但我得到一个未捕获的异常,说我无法编辑在另一个线程中定义的视图。

我很抱歉这本小说,但我已经尝试自己解决这个问题好几个小时了,但没有成功。我觉得这是一件非常简单的事情,我只是没有得到。非常感谢任何帮助!

【问题讨论】:

    标签: android views surfaceview


    【解决方案1】:

    嗯...我认为只有 UI Thread 可以添加和删除视图。尝试像这样调用线程:

    runOnUiThread(new Runnable(){
        public void run() {
            /* STUFF To do in Thread */
            //Delete the view...
            rl.removeView(et);
    }});
    

    希望对你有帮助:)

    【讨论】:

    • 你是说我在我的 Activity 中使用了这个方法吗?我需要根据 SurfaceView 线程中发生的事件删除该视图。抱歉,我基本上对这一切都非常陌生。
    • 正如我在 renderView = new AndroidFastRenderView(this, frameBuffer); 中看到的那样您可以从视图访问 Activity,因此在 Surfaceview Thread 上调用该函数可能很容易。 (类似于 theActivity.runOnUiThread ...)。您还可以在 Activity 类中创建一个完整的函数,并从 SurfaceView 线程调用该函数。希望我解释正确:)
    猜你喜欢
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多