Android: изменение размера пользовательских представлений. Размер родительского элемента изменен, но изменения ширины / высоты не передаются дочернему представлению

В настоящее время я пытаюсь сделать игру на основе старой настольной игры про линкор с использованием 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 занимал только определенную часть экрана, т.е. размер представления должен соответствовать размеру содержимого, которое я хочу создать. с этой точки зрения. В данном случае это двухмерная доска. Это делается путем переопределения метода 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());
}

Я проверяю, изменились ли размеры представлений, переопределив функцию представления 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. Я проверяю размеры ShipView с помощью его метода onMeasure () аналогичным образом.

@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 (), ничего не изменилось, и я игнорирую установленные мной ограничения размеров. Я не уверен, связано ли это с RelativeLayout в ShipView. Должен ли я установить для этого LayoutParams, поскольку они изменились? Я подумал, что если вы измените размер представления родительского элемента, он будет передан потомкам.

Правильный ли это способ сделать это для подобной игры, определенно подлежит обсуждению, но в любом случае Я хотел бы знать, как это можно сделать (я полагаю, может ..?). Любая помощь будет принята с благодарностью.

9
задан Mark Whitaker 8 January 2013 в 13:30
поделиться