我目前正在尝试使用 android 制作基于老式战舰棋盘游戏的游戏。我现在有点乱七八糟,试图感受一下它和我制作游戏可能需要的组件。
基本上我目前在我的布局 xml 文件中拥有以下内容:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<org.greene.battleship.BoardView
android:id="@+id/board_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<org.greene.battleship.ShipView
android:id="@+id/ships_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
</RelativeLayout>
</RelativeLayout>
我希望 BoardView 只占用屏幕的某个部分,即视图应该是我要在此视图中创建的内容的大小。在这种情况下是 2D 板。这是通过覆盖扩展 View 的 onMeasure() 方法来完成的。视图的宽度保持不变,但高度与宽度的值相同,给出了一个完美的正方形。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int parent_width = MeasureSpec.getSize(widthMeasureSpec);
this.setMeasuredDimension(parent_width, parent_width);
Log.d("BOARD_VIEW", "BoardView.onMeasure : width = " + this.getMeasuredWidth() + ", height = "
+ this.getMeasuredHeight());
}
我通过覆盖视图 onSizeChanged() 函数并检查那里的值来检查视图尺寸是否已更改。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
Log.d("BOARD_VIEW", "BoardView.onSizeChanged : width = " + w + ", height = " + h);
board = new Board(w, h, game_activity);
super.onSizeChanged(w, h, oldw, oldh);
}
从布局文件中可以看出,我有一个 RelativeLayout 视图组,其中包含另一个名为 ShipView 的自定义视图作为子视图。理想情况下,我想要发生的是当我去测量它的尺寸时,它的尺寸已经被限制在 onMeasure 中设置的范围内。我以类似的方式通过其 onMeasure() 方法检查 ShipView 的尺寸。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int parent_width = MeasureSpec.getSize(widthMeasureSpec);
int parent_height = MeasureSpec.getSize(heightMeasureSpec);
Log.d("SHIP_VIEW", "ShipView.onMeasure : width = " + parent_width + ", height = " + parent_height);
this.setMeasuredDimension(parent_width, parent_height);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
日志文件向我显示以下内容(onMeasure() 方法似乎被多次调用,但所有值都相同,因此我不会费心显示多个日志,因为值都相同):
05-04 16:36:19.428: DEBUG/BOARD_VIEW(405): BoardView.onMeasure : width = 320, height = 320
05-04 16:36:19.939: DEBUG/BOARD_VIEW(405): BoardView.onSizeChanged : width = 320, height = 320
05-04 16:36:20.429: DEBUG/SHIP_VIEW(405): ShipView.onMeasure : width = 320, height = 430
似乎当我通过 ShipViews onMeasure() 获取尺寸时,什么都没有改变并且忽略了我设置的尺寸限制。我不确定它是否与 ShipView 的 RelativeLayout 有关。既然它们已经改变,我是否必须为此设置 LayoutParams?我认为如果您更改父级的视图维度,它将被传递给子级。
对于这类游戏来说,这是否是正确的做法肯定有待讨论,但无论哪种方式,我都想知道它是如何做到的(我认为它可以......?)。任何帮助将非常感激。