Android / Java - 组合自定义SurfaceView和XML布局?

时间:2016-11-29 21:39:31

标签: java android xml layout surfaceview

我正在制作一个简单的游戏作为一个项目,基本上是Galaga的一个简单版本,并进行了一些修改。我是android和Java(主要是C ++人员)的新手,所以起初我只是让船自动向右移动并按住屏幕使船向左移动。我这样做是为了保持简单(因为在我的GameView中为此任务很容易实现触摸式监听器),这样我就可以在返回并改进特定位功能之前完成应用程序的其余基本框架

现在我的GameView是在GameActivity中以编程方式创建的,然后“setContentView()”用于将活动的视图设置为新的GameView:

public class GameActivity extends AppCompatActivity {

private GameView gameView;

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

    ...

    gameView = new GameView(this, size.x, size.y);
    setContentView(gameView);
}

现在我想要的是,屏幕一角的两个小按钮可左右移动船只,但我仍然坚持如何轻松地做到这一点,因为我一直在想的每一种方式都变得非常复杂(主要是由于是一个机器人新手)。

我能想到的两个最佳方式如下:

1)使用Android Studio XML设计工具将按钮和我的自定义SurfaceView(GameView)放置在正确的位置,然后在我的GameActivity中使用“setContentView(R.layout.activity_game)”。

这会很棒;然而,有两个问题我无法弄清楚如何克服。首先,当我将“视图”拖动到GameActivity的布局中并在弹出窗口中选择我的自定义SurfaceView“GameView”时,我收到一个错误:

enter image description here

另外,正如你在我发布的代码中看到的那样,GameView需要在创建时传递两个整数,如果我只是在我的XML布局中放置一个GameView,我就不知道如何实现这一点和设计师一起。

2)继续像我一样以编程方式创建GameView,使用设计器设置GameActivity布局以包含我需要的所有按钮,然后以编程方式将GameView(自定义SurfaceView)添加到GameActivity布局,最后使用“setContentView(R。 layout.activity_game)”。这对我来说似乎最简单,但我不知道如何获取对默认情况下使用活动创建的整个XML布局的引用(activity_game.xml),然后将创建的GameView添加到它。我只能找到使用“findViewById()”来引用XML格式的部分的代码示例(比如XML格式的布局中的按钮或线性布局)。我想我可以在XML设计器中创建一个Frame布局或者类似的东西,然后将所有内容附加到它上面并使用“findViewById()”将我的GameView附加到框架上,但我不知道这是否有用。最后,我有一种感觉,因为XML布局上的按钮首先存在,以编程方式添加GameView意味着按钮会被掩盖,我不知道如何避免。

很抱歉这个冗长的问题,但我找不到任何示例代码或之前的问题/答案,我只能找到我不确定如何放在一起的点点滴滴。

有关在“activity_game.xml”中创建按钮的最简单方法的任何帮助都显示在我以编程方式创建的GameView的顶部,这样我就可以轻松定位按钮并轻松地通过ID获取点击监听器吗?

编辑:

根据要求,这是activity_game.xml的当前设置,框架布局仅作为我实验的一部分,但由于活动的内容视图设置为GameView,因此现在实际上并未使用。我有按钮只是漂浮在那里,因为现在我只是想让它出现,并且一旦我达到这一点就会担心正确实施:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_game"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.chrisheimlich.galaticrenegade.GameActivity">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/testFrame"
    android:layout_alignParentStart="true">

    <Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginStart="113dp"
        android:layout_marginTop="14dp"
        android:id="@+id/button2" />
</FrameLayout>

0 个答案:

没有答案