gpt4 book ai didi

Android:调整自定义 View 的大小。父级已调整大小但宽度/高度更改未传递给 subview

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:02:37 24 4
gpt4 key购买 nike

我目前正在尝试使用 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 只占据屏幕的特定部分,即 View 应该是我想在此 View 中创建的内容的大小。在这种情况下是二维板。这是通过覆盖扩展 View 的 onMeasure() 方法来完成的。 View 的宽度保持不变,但高度的值与给出完美正方形的宽度的值相同。

@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());
}

我通过覆盖 View onSizeChanged() 函数并检查那里的值来检查 View 尺寸是否已更改。

@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 View 组,其中包含另一个名为 ShipView 的自定义 View 作为 subview 。理想情况下,我想要发生的是当我去测量它的尺寸时,它的尺寸被限制在 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?我认为,如果您更改父级的 View 维度,它就会传递给子级。

对于此类游戏,这样做是否是正确的方法肯定有待讨论,但无论哪种方式,我都想知道它是如何完成的(我想它可以..?)。任何帮助将不胜感激。

最佳答案

归功于此question :

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// let the super class handle calculations
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// set again the dimensions, this time calculated as we want
setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth() / 2);
// this is required because the children keep the super class calculated dimensions (which will not work with the new MyFrameLayout sizes)
final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View v = getChildAt(i);
// this works because you set the dimensions of the ImageView to FILL_PARENT
v.measure(MeasureSpec.makeMeasureSpec(getMeasuredWidth(),
MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
getMeasuredHeight(), MeasureSpec.EXACTLY));
}
}

关于Android:调整自定义 View 的大小。父级已调整大小但宽度/高度更改未传递给 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5886244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com